From 897e9497378bb1651172a020b70eed52727b1a9e Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 17 Jul 2019 16:09:49 +0200 Subject: [PATCH 01/34] change version of node image back to 8.2 for compatibility reasons --- packaging/docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/docker/Dockerfile b/packaging/docker/Dockerfile index 28b1443..5fa8f1b 100644 --- a/packaging/docker/Dockerfile +++ b/packaging/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM node:12.2 AS builder +FROM node:8.2 AS builder RUN apt-get install -y \ git From ca5b7170562dbf738167f76a92673f2ea53bc99b Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 17 Jul 2019 16:33:26 +0200 Subject: [PATCH 02/34] change version of node image 8.6; work around for href warnings with button --- packaging/docker/Dockerfile | 2 +- src/components/editable-header.js | 8 ++++---- src/components/table.js | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packaging/docker/Dockerfile b/packaging/docker/Dockerfile index 5fa8f1b..33e72b7 100644 --- a/packaging/docker/Dockerfile +++ b/packaging/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM node:8.2 AS builder +FROM node:8.6 AS builder RUN apt-get install -y \ git diff --git a/src/components/editable-header.js b/src/components/editable-header.js index 44c0f46..fcc7e53 100644 --- a/src/components/editable-header.js +++ b/src/components/editable-header.js @@ -21,7 +21,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormControl } from 'react-bootstrap'; +import { FormControl, Button } from 'react-bootstrap'; import Icon from './icon'; class EditableHeader extends React.Component { @@ -85,8 +85,8 @@ class EditableHeader extends React.Component { - - + + ; } @@ -95,7 +95,7 @@ class EditableHeader extends React.Component { {this.state.title} - + ; } } diff --git a/src/components/table.js b/src/components/table.js index b81b63a..aec0667 100644 --- a/src/components/table.js +++ b/src/components/table.js @@ -74,7 +74,7 @@ class CustomTable extends Component { if (linkKey && data[linkKey] != null) { cell.push({content}); } else if (child.props.clickable) { - cell.push( child.props.onClick(index)}>{content}); + cell.push(); } else { cell.push(content); } From 9b68230712c23141f5c018f218b607663a2ed62a Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 17 Jul 2019 17:28:31 +0200 Subject: [PATCH 03/34] fix test --- .../components/dialog/edit-widget-control-creator.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/__tests__/components/dialog/edit-widget-control-creator.js b/src/__tests__/components/dialog/edit-widget-control-creator.js index 29e8cd0..d93cdbe 100644 --- a/src/__tests__/components/dialog/edit-widget-control-creator.js +++ b/src/__tests__/components/dialog/edit-widget-control-creator.js @@ -28,12 +28,12 @@ describe('edit widget control creator', () => { { args: { widgetType: 'Lamp' }, result: { controlNumber: 5, controlTypes: [EditWidgetSimulationControl, EditWidgetSignalControl, EditWidgetTextControl, EditWidgetColorControl, EditWidgetColorControl] } }, { args: { widgetType: 'Value' }, result: { controlNumber: 5, controlTypes: [EditWidgetTextControl, EditWidgetSimulationControl, EditWidgetSignalControl, EditWidgetTextSizeControl, EditWidgetCheckboxControl] } }, { args: { widgetType: 'Plot' }, result: { controlNumber: 5, controlTypes: [EditWidgetTimeControl, EditWidgetSimulationControl, EditWidgetSignalsControl, EditWidgetTextControl, EditWidgetMinMaxControl] } }, - { args: { widgetType: 'Table' }, result: { controlNumber: 1, controlTypes: [EditWidgetSimulationControl] } }, + { args: { widgetType: 'Table' }, result: { controlNumber: 2, controlTypes: [EditWidgetSimulationControl, EditWidgetCheckboxControl] } }, { args: { widgetType: 'Image' }, result: { controlNumber: 2, controlTypes: [EditImageWidgetControl, EditWidgetAspectControl] } }, { args: { widgetType: 'Gauge' }, result: { controlNumber: 6, controlTypes: [EditWidgetTextControl, EditWidgetSimulationControl, EditWidgetSignalControl, EditWidgetCheckboxControl, EditWidgetColorZonesControl, EditWidgetMinMaxControl] } }, { args: { widgetType: 'PlotTable' }, result: { controlNumber: 5, controlTypes: [EditWidgetSimulationControl, EditWidgetSignalsControl, EditWidgetTextControl, EditWidgetTimeControl, EditWidgetMinMaxControl] } }, { args: { widgetType: 'Slider' }, result: { controlNumber: 9, controlTypes: [EditWidgetTextControl, EditWidgetOrientation, EditWidgetSimulationControl, EditWidgetSignalControl, EditWidgetCheckboxControl, EditWidgetCheckboxControl, EditWidgetMinMaxControl, EditWidgetNumberControl, EditWidgetNumberControl] } }, - { args: { widgetType: 'Button' }, result: { controlNumber: 4, controlTypes: [EditWidgetColorControl, EditWidgetSimulationControl, EditWidgetSignalControl] } }, + { args: { widgetType: 'Button' }, result: { controlNumber: 6, controlTypes: [EditWidgetTextControl, EditWidgetSimulationControl, EditWidgetSignalControl, EditWidgetCheckboxControl, EditWidgetNumberControl, EditWidgetNumberControl] } }, { args: { widgetType: 'Box' }, result: { controlNumber: 2, controlTypes: [EditWidgetColorControl, EditWidgetColorControl] } }, { args: { widgetType: 'Label' }, result: { controlNumber: 3, controlTypes: [EditWidgetTextControl, EditWidgetTextSizeControl, EditWidgetColorControl] } }, { args: { widgetType: 'HTML' }, result: { controlNumber: 1, controlTypes: [EditWidgetHTMLContent] } }, From 8ace42759aeddbbdfdcab3c9ee1b0465c4759b2c Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 22 Jul 2019 15:59:59 +0200 Subject: [PATCH 04/34] - update a lot of dependencies - adaptions in code for compatibility with new package version (esp. react-bootstrap, react-dnd, and d3-scale) - add (ugly) workaround for flux containers to work with ES6 - use node 12.2 in Dockerfile --- package-lock.json | 2622 ++++++++--------- package.json | 68 +- packaging/docker/Dockerfile | 2 +- src/components/dialogs/edit-project.js | 6 +- src/components/dialogs/edit-simulation.js | 6 +- src/components/dialogs/edit-simulator.js | 8 +- src/components/dialogs/edit-user.js | 8 +- src/components/dialogs/edit-visualization.js | 4 +- .../dialogs/edit-widget-aspect-control.js | 6 +- .../dialogs/edit-widget-checkbox-control.js | 6 +- .../dialogs/edit-widget-color-control.js | 12 +- .../edit-widget-color-zones-control.js | 4 +- .../dialogs/edit-widget-html-content.js | 4 +- .../dialogs/edit-widget-image-control.js | 6 +- .../dialogs/edit-widget-min-max-control.js | 6 +- .../dialogs/edit-widget-number-control.js | 4 +- .../dialogs/edit-widget-orientation.js | 8 +- .../dialogs/edit-widget-parameters-control.js | 4 +- .../dialogs/edit-widget-signal-control.js | 4 +- .../dialogs/edit-widget-signals-control.js | 6 +- .../dialogs/edit-widget-simulation-control.js | 4 +- .../dialogs/edit-widget-text-control.js | 4 +- .../dialogs/edit-widget-text-size-control.js | 6 +- .../dialogs/edit-widget-time-control.js | 6 +- src/components/dialogs/edit-widget.js | 2 +- .../dialogs/import-simulation-model.js | 6 +- src/components/dialogs/import-simulation.js | 10 +- src/components/dialogs/import-simulator.js | 12 +- .../dialogs/import-visualization.js | 6 +- src/components/dialogs/new-project.js | 6 +- src/components/dialogs/new-simulation.js | 6 +- src/components/dialogs/new-simulator.js | 8 +- src/components/dialogs/new-user.js | 12 +- src/components/dialogs/new-visualization.js | 4 +- src/components/login-form.js | 6 +- src/components/signal-mapping.js | 8 +- src/components/simulator-action.js | 6 +- src/components/table.js | 6 +- src/components/widget-plot/plot-legend.js | 3 +- src/components/widget-plot/plot.js | 3 +- src/components/widgets/input.js | 4 +- src/components/widgets/plot-table.js | 4 +- src/containers/FluxContainerConverter.js | 15 + src/containers/app.js | 61 +- src/containers/login.js | 7 +- src/containers/project.js | 3 +- src/containers/projects.js | 3 +- src/containers/select-file.js | 7 +- src/containers/select-simulator.js | 7 +- src/containers/simulation-model.js | 7 +- src/containers/simulation.js | 3 +- src/containers/simulations.js | 3 +- src/containers/simulators.js | 3 +- src/containers/users.js | 3 +- src/containers/visualization.js | 3 +- src/containers/widget.js | 5 +- src/data-managers/rest-data-manager.js | 2 +- 57 files changed, 1533 insertions(+), 1525 deletions(-) create mode 100644 src/containers/FluxContainerConverter.js diff --git a/package-lock.json b/package-lock.json index d1c1633..8ed2120 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", "requires": { "@babel/highlight": "^7.0.0" } @@ -46,13 +46,13 @@ } }, "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", "requires": { - "@babel/types": "^7.4.4", + "@babel/types": "^7.5.5", "jsesc": "^2.5.1", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "source-map": "^0.5.0", "trim-right": "^1.0.1" }, @@ -101,26 +101,26 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.4.tgz", - "integrity": "sha512-UbBHIa2qeAGgyiNR9RszVF7bUHEdgS4JAUNT8SiqrAN6YJVxlOxeLr5pBzb5kan302dejJ9nla4RyKcR1XT6XA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.5.tgz", + "integrity": "sha512-ZsxkyYiRA7Bg+ZTRpPvB6AbOFKTFFK4LrvTet8lInm0V468MWCaSYJE+I7v2z2r8KNLtYiV+K5kTCnR7dvyZjg==", "requires": { "@babel/helper-function-name": "^7.1.0", - "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-member-expression-to-functions": "^7.5.5", "@babel/helper-optimise-call-expression": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.4.4", + "@babel/helper-replace-supers": "^7.5.5", "@babel/helper-split-export-declaration": "^7.4.4" } }, "@babel/helper-define-map": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz", - "integrity": "sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", + "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", "requires": { "@babel/helper-function-name": "^7.1.0", - "@babel/types": "^7.4.4", - "lodash": "^4.17.11" + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" } }, "@babel/helper-explode-assignable-expression": { @@ -159,11 +159,11 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz", - "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", + "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.5.5" } }, "@babel/helper-module-imports": { @@ -175,16 +175,16 @@ } }, "@babel/helper-module-transforms": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz", - "integrity": "sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", + "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/helper-simple-access": "^7.1.0", "@babel/helper-split-export-declaration": "^7.4.4", "@babel/template": "^7.4.4", - "@babel/types": "^7.4.4", - "lodash": "^4.17.11" + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" } }, "@babel/helper-optimise-call-expression": { @@ -201,11 +201,11 @@ "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==" }, "@babel/helper-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.4.4.tgz", - "integrity": "sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", + "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", "requires": { - "lodash": "^4.17.11" + "lodash": "^4.17.13" } }, "@babel/helper-remap-async-to-generator": { @@ -221,14 +221,14 @@ } }, "@babel/helper-replace-supers": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz", - "integrity": "sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", + "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-member-expression-to-functions": "^7.5.5", "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" } }, "@babel/helper-simple-access": { @@ -260,36 +260,29 @@ } }, "@babel/helpers": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz", - "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", + "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", "requires": { "@babel/template": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" } }, "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", "requires": { "chalk": "^2.0.0", "esutils": "^2.0.2", "js-tokens": "^4.0.0" - }, - "dependencies": { - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - } } }, "@babel/parser": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.4.tgz", - "integrity": "sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==" + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==" }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.2.0", @@ -320,6 +313,15 @@ "@babel/plugin-syntax-decorators": "^7.2.0" } }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", + "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0" + } + }, "@babel/plugin-proposal-json-strings": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", @@ -330,9 +332,9 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz", - "integrity": "sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz", + "integrity": "sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-syntax-object-rest-spread": "^7.2.0" @@ -438,9 +440,9 @@ } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz", - "integrity": "sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", + "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", @@ -456,25 +458,25 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz", - "integrity": "sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz", + "integrity": "sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "lodash": "^4.17.11" + "lodash": "^4.17.13" } }, "@babel/plugin-transform-classes": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz", - "integrity": "sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", + "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", "requires": { "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.4.4", + "@babel/helper-define-map": "^7.5.5", "@babel/helper-function-name": "^7.1.0", "@babel/helper-optimise-call-expression": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.4.4", + "@babel/helper-replace-supers": "^7.5.5", "@babel/helper-split-export-declaration": "^7.4.4", "globals": "^11.1.0" } @@ -488,9 +490,9 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz", - "integrity": "sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz", + "integrity": "sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -506,9 +508,9 @@ } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz", - "integrity": "sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", + "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -565,31 +567,34 @@ } }, "@babel/plugin-transform-modules-amd": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz", - "integrity": "sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", + "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", "requires": { "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz", - "integrity": "sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz", + "integrity": "sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ==", "requires": { "@babel/helper-module-transforms": "^7.4.4", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0" + "@babel/helper-simple-access": "^7.1.0", + "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.4.tgz", - "integrity": "sha512-MSiModfILQc3/oqnG7NrP1jHaSPryO6tA2kOMmAQApz5dayPxWiHqmq4sWH2xF5LcQK56LlbKByCd8Aah/OIkQ==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", + "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", "requires": { "@babel/helper-hoist-variables": "^7.4.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-umd": { @@ -602,11 +607,11 @@ } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.4.tgz", - "integrity": "sha512-Ki+Y9nXBlKfhD+LXaRS7v95TtTGYRAf9Y1rTDiE75zf8YQz4GDaWRXosMfJBXxnk88mGFjWdCRIeqDbon7spYA==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz", + "integrity": "sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg==", "requires": { - "regexp-tree": "^0.1.0" + "regexp-tree": "^0.1.6" } }, "@babel/plugin-transform-new-target": { @@ -618,12 +623,12 @@ } }, "@babel/plugin-transform-object-super": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz", - "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", + "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.1.0" + "@babel/helper-replace-supers": "^7.5.5" } }, "@babel/plugin-transform-parameters": { @@ -645,9 +650,9 @@ } }, "@babel/plugin-transform-react-constant-elements": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.2.0.tgz", - "integrity": "sha512-YYQFg6giRFMsZPKUM9v+VcHOdfSQdz9jHCx3akAi3UYgyjndmdYGSXylQ/V+HswQt4fL8IklchD9HTsaOCrWQQ==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.5.0.tgz", + "integrity": "sha512-c5Ba8cpybZFp1Izkf2sWGuNjOxoQ32tFgBvvYvwGhi4+9f6vGiSK9Gex4uVuO/Va6YJFu41aAh1MzMjUWkp0IQ==", "requires": { "@babel/helper-annotate-as-pure": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0" @@ -681,20 +686,20 @@ } }, "@babel/plugin-transform-react-jsx-source": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.2.0.tgz", - "integrity": "sha512-A32OkKTp4i5U6aE88GwwcuV4HAprUgHcTq0sSafLxjr6AW0QahrCRCjxogkbbcdtpbXkuTOlgpjophCxb6sh5g==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.5.0.tgz", + "integrity": "sha512-58Q+Jsy4IDCZx7kqEZuSDdam/1oW8OdDX8f+Loo6xyxdfg1yF0GE2XNJQSTZCaMol93+FBzpWiPEwtbMloAcPg==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-syntax-jsx": "^7.2.0" } }, "@babel/plugin-transform-regenerator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.4.tgz", - "integrity": "sha512-Zz3w+pX1SI0KMIiqshFZkwnVGUhDZzpX2vtPzfJBKQQq8WsP/Xy9DNdELWivxcKOCX/Pywge4SiEaPaLtoDT4g==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", + "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", "requires": { - "regenerator-transform": "^0.13.4" + "regenerator-transform": "^0.14.0" } }, "@babel/plugin-transform-reserved-words": { @@ -766,10 +771,11 @@ } }, "@babel/plugin-transform-typescript": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.4.4.tgz", - "integrity": "sha512-rwDvjaMTx09WC0rXGBRlYSSkEHOKRrecY6hEr3SVIPKII8DVWXtapNAfAyMC0dovuO+zYArcAuKeu3q9DNRfzA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.5.5.tgz", + "integrity": "sha512-pehKf4m640myZu5B2ZviLaiBlxMCjSZ1qTEO459AXKX5GnPueyulJeCqZFs1nz/Ya2dDzXQ1NxZ/kKNWyD4h6w==", "requires": { + "@babel/helper-create-class-features-plugin": "^7.5.5", "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-syntax-typescript": "^7.2.0" } @@ -785,45 +791,47 @@ } }, "@babel/preset-env": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.4.tgz", - "integrity": "sha512-FU1H+ACWqZZqfw1x2G1tgtSSYSfxJLkpaUQL37CenULFARDo+h4xJoVHzRoHbK+85ViLciuI7ME4WTIhFRBBlw==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.5.5.tgz", + "integrity": "sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A==", "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-dynamic-import": "^7.5.0", "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.4.4", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-syntax-json-strings": "^7.2.0", "@babel/plugin-syntax-object-rest-spread": "^7.2.0", "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.4.4", + "@babel/plugin-transform-async-to-generator": "^7.5.0", "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.4.4", - "@babel/plugin-transform-classes": "^7.4.4", + "@babel/plugin-transform-block-scoping": "^7.5.5", + "@babel/plugin-transform-classes": "^7.5.5", "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.4.4", + "@babel/plugin-transform-destructuring": "^7.5.0", "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/plugin-transform-duplicate-keys": "^7.2.0", + "@babel/plugin-transform-duplicate-keys": "^7.5.0", "@babel/plugin-transform-exponentiation-operator": "^7.2.0", "@babel/plugin-transform-for-of": "^7.4.4", "@babel/plugin-transform-function-name": "^7.4.4", "@babel/plugin-transform-literals": "^7.2.0", "@babel/plugin-transform-member-expression-literals": "^7.2.0", - "@babel/plugin-transform-modules-amd": "^7.2.0", - "@babel/plugin-transform-modules-commonjs": "^7.4.4", - "@babel/plugin-transform-modules-systemjs": "^7.4.4", + "@babel/plugin-transform-modules-amd": "^7.5.0", + "@babel/plugin-transform-modules-commonjs": "^7.5.0", + "@babel/plugin-transform-modules-systemjs": "^7.5.0", "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5", "@babel/plugin-transform-new-target": "^7.4.4", - "@babel/plugin-transform-object-super": "^7.2.0", + "@babel/plugin-transform-object-super": "^7.5.5", "@babel/plugin-transform-parameters": "^7.4.4", "@babel/plugin-transform-property-literals": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.4.4", + "@babel/plugin-transform-regenerator": "^7.4.5", "@babel/plugin-transform-reserved-words": "^7.2.0", "@babel/plugin-transform-shorthand-properties": "^7.2.0", "@babel/plugin-transform-spread": "^7.2.0", @@ -831,9 +839,9 @@ "@babel/plugin-transform-template-literals": "^7.4.4", "@babel/plugin-transform-typeof-symbol": "^7.2.0", "@babel/plugin-transform-unicode-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "browserslist": "^4.5.2", - "core-js-compat": "^3.0.0", + "@babel/types": "^7.5.5", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", "invariant": "^2.2.2", "js-levenshtein": "^1.1.3", "semver": "^5.5.0" @@ -868,17 +876,17 @@ } }, "@babel/runtime": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz", - "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz", + "integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==", "requires": { "regenerator-runtime": "^0.13.2" }, "dependencies": { "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" } } }, @@ -893,28 +901,28 @@ } }, "@babel/traverse": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.4.tgz", - "integrity": "sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", "@babel/helper-function-name": "^7.1.0", "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.11" + "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", "requires": { "esutils": "^2.0.2", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } }, @@ -944,34 +952,25 @@ "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-9.0.1.tgz", "integrity": "sha512-6It2EVfGskxZCQhuykrfnALg7oVeiI6KclWSmGDqB0AiInVrTGB9Jp9i4/Ad21u9Jde/voVQz6eFX/eSg/UsPA==" }, + "@fortawesome/fontawesome-common-types": { + "version": "0.2.19", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.19.tgz", + "integrity": "sha512-nd2Ul/CUs8U9sjofQYAALzOGpgkVJQgEhIJnOHaoyVR/LeC3x2mVg4eB910a4kS6WgLPebAY0M2fApEI497raQ==" + }, "@fortawesome/fontawesome-svg-core": { - "version": "1.2.18", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.18.tgz", - "integrity": "sha512-1vyLWVQqxQ8q8bA2zgZcljk3RkeELlDJ757ymLk+ebK019AFgEFH5kTnR5OMN1SFsTwW1OHlFQO3VufdeCg/Gg==", + "version": "1.2.19", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.19.tgz", + "integrity": "sha512-D4ICXg9oU08eF9o7Or392gPpjmwwgJu8ecCFusthbID95CLVXOgIyd4mOKD9Nud5Ckz+Ty59pqkNtThDKR0erA==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.18" - }, - "dependencies": { - "@fortawesome/fontawesome-common-types": { - "version": "0.2.18", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.18.tgz", - "integrity": "sha512-834DrzO2Ne3upCW+mJJPC/E6BsFcj+2Z1HmPIhbpbj8UaKmXWum4NClqLpUiMetugRlHuG4jbIHNdv2/lc3c1Q==" - } + "@fortawesome/fontawesome-common-types": "^0.2.19" } }, "@fortawesome/free-solid-svg-icons": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.8.2.tgz", - "integrity": "sha512-5tF6WOFlqqO95zY5ukSB6jliDa3jnk1p5L4K/a58ccDFsbjSkhfGuvZkRkeWxH8uMms81pZd6yQTwQrkedeJmg==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.9.0.tgz", + "integrity": "sha512-U8YXPfWcSozsCW0psCtlRGKjjRs5+Am5JJwLOUmVHFZbIEWzaz4YbP84EoPwUsVmSAKrisu3QeNcVOtmGml0Xw==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.18" - }, - "dependencies": { - "@fortawesome/fontawesome-common-types": { - "version": "0.2.18", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.18.tgz", - "integrity": "sha512-834DrzO2Ne3upCW+mJJPC/E6BsFcj+2Z1HmPIhbpbj8UaKmXWum4NClqLpUiMetugRlHuG4jbIHNdv2/lc3c1Q==" - } + "@fortawesome/fontawesome-common-types": "^0.2.19" } }, "@fortawesome/react-fontawesome": { @@ -989,26 +988,39 @@ "integrity": "sha512-mV6T0IYqb0xL1UALPFplXYQmR0twnXG0M6jUswpquqT2sD12BOiCiLy3EvMp/Fy7s3DZElC4/aPjEjo2jeZpvw==" }, "@hapi/hoek": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-6.2.1.tgz", - "integrity": "sha512-+ryw4GU9pjr1uT6lBuErHJg3NYqzwJTvZ75nKuJijEzpd00Uqi6oiawTGDDf5Hl0zWmI7qHfOtaqB0kpQZJQzA==" + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-6.2.4.tgz", + "integrity": "sha512-HOJ20Kc93DkDVvjwHyHawPwPkX44sIrbXazAUDiUXaY2R9JwQGo2PhFfnQtdrsIe4igjG2fPgMra7NYw7qhy0A==" }, "@hapi/joi": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.0.3.tgz", - "integrity": "sha512-z6CesJ2YBwgVCi+ci8SI8zixoj8bGFn/vZb9MBPbSyoxsS2PnWYjHcyTM17VLK6tx64YVK38SDIh10hJypB+ig==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.0.tgz", + "integrity": "sha512-n6kaRQO8S+kepUTbXL9O/UOL788Odqs38/VOfoCrATDtTvyfiO3fgjlSRaNkHabpTLgM7qru9ifqXlXbXk8SeQ==", "requires": { "@hapi/address": "2.x.x", "@hapi/hoek": "6.x.x", + "@hapi/marker": "1.x.x", "@hapi/topo": "3.x.x" } }, + "@hapi/marker": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@hapi/marker/-/marker-1.0.0.tgz", + "integrity": "sha512-JOfdekTXnJexfE8PyhZFyHvHjt81rBFSAbTIRAhF2vv/2Y1JzoKsGqxH/GpZJoF7aEfYok8JVcAHmSz1gkBieA==" + }, "@hapi/topo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.0.tgz", - "integrity": "sha512-gZDI/eXOIk8kP2PkUKjWu9RW8GGVd2Hkgjxyr/S7Z+JF+0mr7bAlbw+DkTRxnD580o8Kqxlnba9wvqp5aOHBww==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.2.tgz", + "integrity": "sha512-r+aumOqJ5QbD6aLPJWqVjMAPsx5pZKz+F5yPqXZ/WWG9JTtHbQqlzrJoknJ0iJxLj9vlXtmpSdjlkszseeG8OA==", "requires": { - "@hapi/hoek": "6.x.x" + "@hapi/hoek": "8.x.x" + }, + "dependencies": { + "@hapi/hoek": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.0.2.tgz", + "integrity": "sha512-O6o6mrV4P65vVccxymuruucb+GhP2zl9NLCG8OdoFRS8BEGw3vwpPp20wpAtpbQQxz1CEUtmxJGgWhjq1XA3qw==" + } } }, "@jest/console": { @@ -1217,6 +1229,39 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" }, + "@react-bootstrap/react-popper": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@react-bootstrap/react-popper/-/react-popper-1.2.1.tgz", + "integrity": "sha512-4l3q7LcZEhrSkI4d3Ie3g4CdrXqqTexXX4PFT45CB0z5z2JUbaxgRwKNq7r5j2bLdVpZm+uvUGqxJw8d9vgbJQ==", + "requires": { + "babel-runtime": "6.x.x", + "create-react-context": "^0.2.1", + "popper.js": "^1.14.4", + "prop-types": "^15.6.1", + "typed-styles": "^0.0.5", + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "@restart/context": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", + "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==" + }, + "@restart/hooks": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.8.tgz", + "integrity": "sha512-0AO6p7iOqWeLu9++Qz1P0efRmA7nDT3uMx4banEUj0KZLNOBkK98zddsKtRjwBlJw2dbL/V+u5+recuCwjO/pg==" + }, "@svgr/babel-plugin-add-jsx-attribute": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", @@ -1238,9 +1283,9 @@ "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==" }, "@svgr/babel-plugin-svg-dynamic-title": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.2.0.tgz", - "integrity": "sha512-gH2qItapwCUp6CCqbxvzBbc4dh4OyxdYKsW3EOkYexr0XUmQL0ScbdNh6DexkZ01T+sdClniIbnCObsXcnx3sQ==" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.1.tgz", + "integrity": "sha512-p6z6JJroP989jHWcuraeWpzdejehTmLUpyC9smhTBWyPN0VVGe2phbYxpPTV7Vh8XzmFrcG55idrnfWn/2oQEw==" }, "@svgr/babel-plugin-svg-em-dimensions": { "version": "4.2.0", @@ -1258,59 +1303,90 @@ "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==" }, "@svgr/babel-preset": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.2.0.tgz", - "integrity": "sha512-iLetHpRCQXfK47voAs5/uxd736cCyocEdorisjAveZo8ShxJ/ivSZgstBmucI1c8HyMF5tOrilJLoFbhpkPiKw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.1.tgz", + "integrity": "sha512-rPFKLmyhlh6oeBv3j2vEAj2nd2QbWqpoJLKzBLjwQVt+d9aeXajVaPNEqrES2spjXKR4OxfgSs7U0NtmAEkr0Q==", "requires": { "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", - "@svgr/babel-plugin-svg-dynamic-title": "^4.2.0", + "@svgr/babel-plugin-svg-dynamic-title": "^4.3.1", "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", "@svgr/babel-plugin-transform-svg-component": "^4.2.0" } }, "@svgr/core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.2.0.tgz", - "integrity": "sha512-nvzXaf2VavqjMCTTfsZfjL4o9035KedALkMzk82qOlHOwBb8JT+9+zYDgBl0oOunbVF94WTLnvGunEg0csNP3Q==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.2.tgz", + "integrity": "sha512-N+tP5CLFd1hP9RpO83QJPZY3NL8AtrdqNbuhRgBkjE/49RnMrrRsFm1wY8pueUfAGvzn6tSXUq29o6ah8RuR5w==", "requires": { - "@svgr/plugin-jsx": "^4.2.0", + "@svgr/plugin-jsx": "^4.3.2", "camelcase": "^5.3.1", - "cosmiconfig": "^5.2.0" + "cosmiconfig": "^5.2.1" } }, "@svgr/hast-util-to-babel-ast": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.2.0.tgz", - "integrity": "sha512-IvAeb7gqrGB5TH9EGyBsPrMRH/QCzIuAkLySKvH2TLfLb2uqk98qtJamordRQTpHH3e6TORfBXoTo7L7Opo/Ow==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz", + "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", "requires": { - "@babel/types": "^7.4.0" + "@babel/types": "^7.4.4" } }, "@svgr/plugin-jsx": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.2.0.tgz", - "integrity": "sha512-AM1YokmZITgveY9bulLVquqNmwiFo2Px2HL+IlnTCR01YvWDfRL5QKdnF7VjRaS5MNP938mmqvL0/8oz3zQMkg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.2.tgz", + "integrity": "sha512-+1GW32RvmNmCsOkMoclA/TppNjHPLMnNZG3/Ecscxawp051XJ2MkO09Hn11VcotdC2EPrDfT8pELGRo+kbZ1Eg==", "requires": { - "@babel/core": "^7.4.3", - "@svgr/babel-preset": "^4.2.0", - "@svgr/hast-util-to-babel-ast": "^4.2.0", - "rehype-parse": "^6.0.0", - "unified": "^7.1.0", - "vfile": "^4.0.0" + "@babel/core": "^7.4.5", + "@svgr/babel-preset": "^4.3.1", + "@svgr/hast-util-to-babel-ast": "^4.3.2", + "svg-parser": "^2.0.0" + }, + "dependencies": { + "@babel/core": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", + "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helpers": "^7.5.5", + "@babel/parser": "^7.5.5", + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } } }, "@svgr/plugin-svgo": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.2.0.tgz", - "integrity": "sha512-zUEKgkT172YzHh3mb2B2q92xCnOAMVjRx+o0waZ1U50XqKLrVQ/8dDqTAtnmapdLsGurv8PSwenjLCUpj6hcvw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz", + "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", "requires": { - "cosmiconfig": "^5.2.0", + "cosmiconfig": "^5.2.1", "merge-deep": "^3.0.2", - "svgo": "^1.2.1" + "svgo": "^1.2.2" } }, "@svgr/webpack": { @@ -1328,6 +1404,11 @@ "loader-utils": "^1.1.0" } }, + "@types/asap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/asap/-/asap-2.0.0.tgz", + "integrity": "sha512-upIS0Gt9Mc8eEpCbYMZ1K8rhNosfKUtimNcINce+zLwJF5UpM3Vv7yz3S5l/1IX+DxTa8lTkUjqynvjRXyJzsg==" + }, "@types/babel__core": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.2.tgz", @@ -1358,13 +1439,27 @@ } }, "@types/babel__traverse": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.6.tgz", - "integrity": "sha512-XYVgHF2sQ0YblLRMLNPB3CkFMewzFmlDsH/TneZFHUXDlABQgh88uOxuez7ZcXxayLFrqLwtDH1t+FmlFwNZxw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.7.tgz", + "integrity": "sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw==", "requires": { "@babel/types": "^7.3.0" } }, + "@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "requires": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "@types/invariant": { + "version": "2.2.30", + "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.30.tgz", + "integrity": "sha512-98fB+yo7imSD2F7PF7GIpELNgtLNgo5wjivu0W5V4jx+KVVJxo6p/qN4zdzSTBWy4/sN3pPyXwnhRSD28QX+ag==" + }, "@types/istanbul-lib-coverage": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", @@ -1387,45 +1482,35 @@ "@types/istanbul-lib-report": "*" } }, - "@types/node": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.2.tgz", - "integrity": "sha512-5tabW/i+9mhrfEOUcLDu2xBPsHJ+X5Orqy9FKpale3SjDA17j5AEpYq5vfy3oAeAHGcvANRCO3NV3d2D6q3NiA==" + "@types/prop-types": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.1.tgz", + "integrity": "sha512-CFzn9idOEpHrgdw8JsoTkaDDyRWk1jrzIV8djzcgpq0y9tG4B4lFT+Nxh52DVpDXV+n4+NPNv7M1Dj5uMp6XFg==" }, "@types/q": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" }, + "@types/react": { + "version": "16.8.23", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.8.23.tgz", + "integrity": "sha512-abkEOIeljniUN9qB5onp++g0EY38h7atnDHxwKUFz1r3VH1+yG1OKi2sNPTyObL40goBmfKFpdii2lEzwLX1cA==", + "requires": { + "@types/prop-types": "*", + "csstype": "^2.2.0" + } + }, + "@types/shallowequal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/shallowequal/-/shallowequal-1.1.1.tgz", + "integrity": "sha512-Lhni3aX80zbpdxRuWhnuYPm8j8UQaa571lHP/xI4W+7BAFhSIhRReXnqjEgT/XzPoXZTJkCqstFMJ8CZTK6IlQ==" + }, "@types/stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" }, - "@types/unist": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", - "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" - }, - "@types/vfile": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/vfile/-/vfile-3.0.2.tgz", - "integrity": "sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw==", - "requires": { - "@types/node": "*", - "@types/unist": "*", - "@types/vfile-message": "*" - } - }, - "@types/vfile-message": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-1.0.1.tgz", - "integrity": "sha512-mlGER3Aqmq7bqR1tTTIVHq8KSAFFRyGbrxuM8C/H82g6k7r2fS+IMEkIu3D7JHzG10NvPdR8DNx0jr0pwpp4dA==", - "requires": { - "@types/node": "*", - "@types/unist": "*" - } - }, "@types/yargs": { "version": "12.0.12", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz", @@ -1651,9 +1736,9 @@ } }, "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==" + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.1.tgz", + "integrity": "sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q==" }, "acorn-dynamic-import": { "version": "4.0.0", @@ -1675,9 +1760,9 @@ "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==" }, "acorn-walk": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", - "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==" + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" }, "add-dom-event-listener": { "version": "1.1.0", @@ -1698,9 +1783,9 @@ "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg==" }, "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -1714,9 +1799,9 @@ "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" }, "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==" + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" }, "alphanum-sort": { "version": "1.0.2", @@ -1944,7 +2029,7 @@ }, "asynckit": { "version": "0.4.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "atob": { @@ -1953,16 +2038,24 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "autoprefixer": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.5.1.tgz", - "integrity": "sha512-KJSzkStUl3wP0D5sdMlP82Q52JLy5+atf2MHAre48+ckWkXgixmfHyWmA77wFDy6jTHU6mIgXv6hAQ2mf1PjJQ==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.1.tgz", + "integrity": "sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==", "requires": { - "browserslist": "^4.5.4", - "caniuse-lite": "^1.0.30000957", + "browserslist": "^4.6.3", + "caniuse-lite": "^1.0.30000980", + "chalk": "^2.4.2", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.14", - "postcss-value-parser": "^3.3.1" + "postcss": "^7.0.17", + "postcss-value-parser": "^4.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.0.tgz", + "integrity": "sha512-ESPktioptiSUchCKgggAkzdmkgzKfmp0EU8jXH+5kbIUB+unr0Y4CY9SRMvibuvYUBjNh1ACLbxqYNpdTQOteQ==" + } } }, "aws-sign2": { @@ -2015,6 +2108,11 @@ "supports-color": "^2.0.0" } }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -2088,18 +2186,19 @@ } }, "babel-plugin-dynamic-import-node": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.2.0.tgz", - "integrity": "sha512-fP899ELUnTaBcIzmrW7nniyqqdYWrWuJUyPWHxFa/c7r7hS6KC8FscNfLlBNIoPSc55kYMGEEKjPjJGCLbE1qA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", "requires": { "object.assign": "^4.1.0" } }, "babel-plugin-istanbul": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.4.tgz", - "integrity": "sha512-dySz4VJMH+dpndj0wjJ8JPs/7i1TdSPb1nRrn56/92pKOF9VKC1FMFJmMXjzlGGusnCAqujP6PBCiKq0sVA+YQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", "requires": { + "@babel/helper-plugin-utils": "^7.0.0", "find-up": "^3.0.0", "istanbul-lib-instrument": "^3.3.0", "test-exclude": "^5.2.3" @@ -2213,6 +2312,15 @@ "@babel/helper-plugin-utils": "^7.0.0" } }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.2.0.tgz", + "integrity": "sha512-YYQFg6giRFMsZPKUM9v+VcHOdfSQdz9jHCx3akAi3UYgyjndmdYGSXylQ/V+HswQt4fL8IklchD9HTsaOCrWQQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, "@babel/preset-env": { "version": "7.4.3", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.3.tgz", @@ -2276,10 +2384,18 @@ "regenerator-runtime": "^0.13.2" } }, + "babel-plugin-dynamic-import-node": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.2.0.tgz", + "integrity": "sha512-fP899ELUnTaBcIzmrW7nniyqqdYWrWuJUyPWHxFa/c7r7hS6KC8FscNfLlBNIoPSc55kYMGEEKjPjJGCLbE1qA==", + "requires": { + "object.assign": "^4.1.0" + } + }, "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" }, "semver": { "version": "5.7.0", @@ -2295,13 +2411,6 @@ "requires": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" - } } }, "babylon": { @@ -2309,11 +2418,6 @@ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" }, - "bail": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.4.tgz", - "integrity": "sha512-S8vuDB4w6YpRhICUDET3guPlQpaJl7od94tpZ0Fvnyp+MKW/HyDTcRDck+29C9g+d/qQHnddRH3+94kZdrW0Ww==" - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -2408,9 +2512,9 @@ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" }, "bluebird": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz", - "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==" + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==" }, "bn.js": { "version": "4.11.8", @@ -2418,22 +2522,27 @@ "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" }, "body-parser": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", - "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "requires": { - "bytes": "3.0.0", + "bytes": "3.1.0", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "~1.6.3", - "iconv-lite": "0.4.23", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.5.2", - "raw-body": "2.3.3", - "type-is": "~1.6.16" + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" }, "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -2442,18 +2551,15 @@ "ms": "2.0.0" } }, - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" } } }, @@ -2476,9 +2582,9 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, "bootstrap": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz", - "integrity": "sha1-WjiTlFSfIzMIdaOxUGVldPip63E=" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.1.tgz", + "integrity": "sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag==" }, "brace-expansion": { "version": "1.1.11", @@ -2607,19 +2713,19 @@ } }, "browserslist": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.0.tgz", - "integrity": "sha512-Jk0YFwXBuMOOol8n6FhgkDzn3mY9PYLYGk29zybF05SbRTsMgPqmTNeQQhOghCxq5oFqAXE3u4sYddr4C0uRhg==", + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz", + "integrity": "sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==", "requires": { - "caniuse-lite": "^1.0.30000967", - "electron-to-chromium": "^1.3.133", - "node-releases": "^1.1.19" + "caniuse-lite": "^1.0.30000984", + "electron-to-chromium": "^1.3.191", + "node-releases": "^1.1.25" } }, "bser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", - "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.0.tgz", + "integrity": "sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg==", "requires": { "node-int64": "^0.4.0" } @@ -2660,21 +2766,21 @@ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, "cacache": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", - "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", + "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", "requires": { - "bluebird": "^3.5.3", + "bluebird": "^3.5.5", "chownr": "^1.1.1", "figgy-pudding": "^3.5.1", - "glob": "^7.1.3", + "glob": "^7.1.4", "graceful-fs": "^4.1.15", "lru-cache": "^5.1.1", "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "move-concurrently": "^1.0.1", "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", + "rimraf": "^2.6.3", "ssri": "^6.0.1", "unique-filename": "^1.1.1", "y18n": "^4.0.0" @@ -2748,9 +2854,9 @@ } }, "caniuse-lite": { - "version": "1.0.30000967", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000967.tgz", - "integrity": "sha512-rUBIbap+VJfxTzrM4akJ00lkvVb5/n5v3EGXfWzSH5zT8aJmGzjA8HWhJ4U6kCpzxozUSnB+yvAYDRPY6mRpgQ==" + "version": "1.0.30000985", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000985.tgz", + "integrity": "sha512-1ngiwkgqAYPG0JSSUp3PUDGPKKY59EK7NrGGX+VOxaKCNzRbNc7uXMny+c3VJfZxtoK3wSImTvG9T9sXiTw2+w==" }, "capture-exit": { "version": "2.0.0", @@ -2770,11 +2876,6 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, - "ccount": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.4.tgz", - "integrity": "sha512-fpZ81yYfzentuieinmGnphk0pLkOTMm6MZdVqwd77ROvhko6iujLNGrHH5E7utq3ygWklwfmwuG+A7P+NpqT6w==" - }, "chai": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", @@ -3318,14 +3419,14 @@ } }, "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", + "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==" }, "chrome-trace-event": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", - "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", "requires": { "tslib": "^1.9.0" } @@ -3413,6 +3514,11 @@ "shallow-clone": "^0.1.2" } }, + "clsx": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.0.4.tgz", + "integrity": "sha512-1mQ557MIZTrL/140j+JVdRM6e31/OA4vTYxXgqIIZlndyfjHpyawKZia1Im05Vp9BWmImkcNrNtFYQMyFcgJDg==" + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -3443,9 +3549,9 @@ } }, "color": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.1.tgz", - "integrity": "sha512-PvUltIXRjehRKPSy89VnDWFKY58xyhTLyxIg21vwQBI6qLwZNPmC8k3C1uytIgFKEpOIzN4y32iPm8231zFHIg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", "requires": { "color-convert": "^1.9.1", "color-string": "^1.5.2" @@ -3481,11 +3587,6 @@ "delayed-stream": "~1.0.0" } }, - "comma-separated-tokens": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.7.tgz", - "integrity": "sha512-Jrx3xsP4pPv4AwJUDWY9wOXGtwPXARej6Xd99h4TUGotmf8APuquKMpK+dnD3UgyxK7OEWaisjZz+3b5jtL6xQ==" - }, "commander": { "version": "2.20.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", @@ -3601,9 +3702,12 @@ "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" }, "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } }, "content-type": { "version": "1.0.4", @@ -3619,9 +3723,9 @@ } }, "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" }, "cookie-signature": { "version": "1.0.6", @@ -3652,36 +3756,35 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" }, "core-js-compat": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.0.1.tgz", - "integrity": "sha512-2pC3e+Ht/1/gD7Sim/sqzvRplMiRnFQVlPpDVaHtY9l7zZP7knamr3VRD6NyGfHd84MrDC0tAM9ulNxYMW0T3g==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.1.4.tgz", + "integrity": "sha512-Z5zbO9f1d0YrJdoaQhphVAnKPimX92D6z8lCGphH89MNRxlL1prI9ExJPqVwP0/kgkQCv8c4GJGT8X16yUncOg==", "requires": { - "browserslist": "^4.5.4", - "core-js": "3.0.1", - "core-js-pure": "3.0.1", - "semver": "^6.0.0" + "browserslist": "^4.6.2", + "core-js-pure": "3.1.4", + "semver": "^6.1.1" }, "dependencies": { - "core-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.0.1.tgz", - "integrity": "sha512-sco40rF+2KlE0ROMvydjkrVMMG1vYilP2ALoRXcYR4obqbYIuV3Bg+51GEDW+HF8n7NRA+iaA4qD0nD9lo9mew==" + "semver": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", + "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==" } } }, "core-js-pure": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.0.1.tgz", - "integrity": "sha512-mSxeQ6IghKW3MoyF4cz19GJ1cMm7761ON+WObSyLfTu/Jn3x7w4NwNFnrZxgl4MTSvYYepVLNuRtlB4loMwJ5g==" + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.1.4.tgz", + "integrity": "sha512-uJ4Z7iPNwiu1foygbcZYJsJs1jiXrTTCvxfLDXNhI/I+NHbSIEyr548y4fcsCEyWY0XgfAG/qqaunJ1SThHenA==" }, "core-util-is": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { @@ -3739,6 +3842,15 @@ "object-assign": "^4.1.1" } }, + "create-react-context": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.3.tgz", + "integrity": "sha512-CQBmD0+QGgTaxDL3OX1IDXYqjkp2It4RIbcb99jS6AEg27Ga+a9G3JtK6SIu0HBwPLZlmwt9F7UwWA4Bn92Rag==", + "requires": { + "fbjs": "^0.8.0", + "gud": "^1.0.0" + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -3883,11 +3995,11 @@ "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" }, "css-tree": { - "version": "1.0.0-alpha.28", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.28.tgz", - "integrity": "sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w==", + "version": "1.0.0-alpha.33", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.33.tgz", + "integrity": "sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w==", "requires": { - "mdn-data": "~1.1.0", + "mdn-data": "2.0.4", "source-map": "^0.5.3" }, "dependencies": { @@ -3903,11 +4015,6 @@ "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz", "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=" }, - "css-url-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-url-regex/-/css-url-regex-1.1.0.tgz", - "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=" - }, "css-what": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", @@ -4011,6 +4118,11 @@ "source-map": "^0.5.3" } }, + "mdn-data": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", + "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==" + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -4019,18 +4131,23 @@ } }, "cssom": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", - "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==" + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" }, "cssstyle": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz", - "integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", "requires": { "cssom": "0.3.x" } }, + "csstype": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.6.tgz", + "integrity": "sha512-RpFbQGUE74iyPgvr46U9t1xoQBM8T4BL8SxrN66Le2xYAPSaDJJKeztV3awugusb3g3G9iL8StmkBBXhcbbXhg==" + }, "cyclist": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", @@ -4042,62 +4159,57 @@ "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=" }, "d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.2.0.tgz", + "integrity": "sha512-eE0QmSh6xToqM3sxHiJYg/QFdNn52ZEgmFE8A8abU8GsHvsIOolqH8B70/8+VGAKm5MlwaExhqR3DLIjOJMLPA==" }, "d3-axis": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" }, + "d3-color": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.2.8.tgz", + "integrity": "sha512-yeANXzP37PHk0DbSTMNPhnJD+Nn4G//O5E825bR6fAfHH43hobSBpgB9G9oWVl9+XgUaQ4yCnsX1H+l8DoaL9A==" + }, + "d3-format": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.3.2.tgz", + "integrity": "sha512-Z18Dprj96ExragQ0DeGi+SYPQ7pPfRMtUXtsg/ChVIKNBCzjO8XYJvRTC1usblx52lqge56V5ect+frYTQc8WQ==" + }, + "d3-interpolate": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.3.2.tgz", + "integrity": "sha512-NlNKGopqaz9qM1PXh9gBF1KSCVh+jSFErrSlD/4hybwoNX/gt1d8CDbDW+3i+5UOHhjC6s6nMvRxcuoMVNgL2w==", + "requires": { + "d3-color": "1" + } + }, "d3-path": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.7.tgz", "integrity": "sha512-q0cW1RpvA5c5ma2rch62mX8AYaiLX0+bdaSM2wxSU9tXjU4DNvkx9qiUvjkuWCj3p22UO/hlPivujqMiR9PDzA==" }, "d3-scale": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz", - "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.0.0.tgz", + "integrity": "sha512-ktic5HBFlAZj2CN8CCl/p/JyY8bMQluN7+fA6ICE6yyoMOnSQAZ1Bb8/5LcNpNKMBMJge+5Vv4pWJhARYlQYFw==", "requires": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-color": "1", + "d3-array": "^1.2.0 || 2", "d3-format": "1", "d3-interpolate": "1", "d3-time": "1", "d3-time-format": "2" - }, - "dependencies": { - "d3-collection": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.4.tgz", - "integrity": "sha1-NC39EoN8kJdPM/HMCnha6lcNzcI=" - }, - "d3-color": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.0.3.tgz", - "integrity": "sha1-vHZD/KjlOoNH4vva/6I2eWtYUJs=" - }, - "d3-format": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.2.2.tgz", - "integrity": "sha512-zH9CfF/3C8zUI47nsiKfD0+AGDEuM8LwBIP7pBVpyR4l/sKkZqITmMtxRp04rwBrlshIZ17XeFAaovN3++wzkw==" - }, - "d3-interpolate": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.6.tgz", - "integrity": "sha512-mOnv5a+pZzkNIHtw/V6I+w9Lqm9L5bG3OTXPM5A+QO0yyVMQ4W1uZhR+VOJmazaOZXri2ppbiZ5BUNWT0pFM9A==", - "requires": { - "d3-color": "1" - } - }, - "d3-time": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.8.tgz", - "integrity": "sha512-YRZkNhphZh3KcnBfitvF3c6E0JOFGikHZ4YqD+Lzv83ZHn1/u6yGenRU1m+KAk9J1GnZMnKcrtfvSktlA1DXNQ==" - } + } + }, + "d3-scale-chromatic": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.3.3.tgz", + "integrity": "sha512-BWTipif1CimXcYfT02LKjAyItX5gKiwxuPRgr4xM58JwlLocWbjPLI7aMEjkcoOQXMkYsmNsvv3d2yl/OKuHHw==", + "requires": { + "d3-color": "1", + "d3-interpolate": "1" } }, "d3-selection": { @@ -4298,7 +4410,7 @@ }, "delayed-stream": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "depd": { @@ -4378,20 +4490,16 @@ "path-type": "^3.0.0" } }, - "disposables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/disposables/-/disposables-1.0.2.tgz", - "integrity": "sha1-NsamdEdfVaLWkTVnpgFETkh7S24=" - }, "dnd-core": { - "version": "2.6.0", - "resolved": "http://registry.npmjs.org/dnd-core/-/dnd-core-2.6.0.tgz", - "integrity": "sha1-ErrWbVh0LG5ffPKUP7aFlED4CcQ=", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-9.3.2.tgz", + "integrity": "sha512-cc6aAFmLDYdXguC+YbKB+SCsXlNd+LS/+T22M4OpmehWI3wBqXBik3o+myjr19ie3K11S3ATTiwir7b0s3TAhw==", "requires": { + "@types/asap": "^2.0.0", + "@types/invariant": "^2.2.30", "asap": "^2.0.6", - "invariant": "^2.0.0", - "lodash": "^4.2.0", - "redux": "^3.7.1" + "invariant": "^2.2.4", + "redux": "^4.0.1" } }, "dns-equal": { @@ -4425,9 +4533,9 @@ } }, "dom-align": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.8.2.tgz", - "integrity": "sha512-17vInOylbB7H4qua7QRsmQT05FFTZemO8BhnOPgF9BPqjAPDyQr/9V8fmJbn05vQ31m2gu3EJSSYN2u94szUZg==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.9.0.tgz", + "integrity": "sha512-HvPfXISxoU7dKrbqS4vIFa1hx88wD7VdKaZ7sHWeow8y76tuzsxXkiPGbeilemLXrTd9cWbPqR4MOl4y3dkcXA==" }, "dom-converter": { "version": "0.2.0", @@ -4438,9 +4546,12 @@ } }, "dom-helpers": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.3.1.tgz", - "integrity": "sha512-2Sm+JaYn74OiTM2wHvxJOo3roiq/h25Yi69Fqk269cNUwIXsCvATB6CRSFC9Am/20G2b28hGv/+7NiWydIrPvg==" + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "requires": { + "@babel/runtime": "^7.1.2" + } }, "dom-serializer": { "version": "0.1.1", @@ -4535,14 +4646,14 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.134", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.134.tgz", - "integrity": "sha512-C3uK2SrtWg/gSWaluLHWSHjyebVZCe4ZC0NVgTAoTq8tCR9FareRK5T7R7AS/nPZShtlEcjVMX1kQ8wi4nU68w==" + "version": "1.3.199", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.199.tgz", + "integrity": "sha512-gachlDdHSK47s0N2e58GH9HMC6Z4ip0SfmYUa5iEbE50AKaOUXysaJnXMfKj0xB245jWbYcyFSH+th3rqsF8hA==" }, "elliptic": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", - "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.0.tgz", + "integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==", "requires": { "bn.js": "^4.4.0", "brorand": "^1.0.1", @@ -4570,20 +4681,10 @@ }, "encoding": { "version": "0.1.12", - "resolved": false, + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { "iconv-lite": "~0.4.13" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", - "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", - "requires": { - "safer-buffer": "^2.1.0" - } - } } }, "end-of-stream": { @@ -4649,9 +4750,9 @@ } }, "es6-promise": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", - "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==" + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, "escape-html": { "version": "1.0.3", @@ -4726,9 +4827,9 @@ }, "dependencies": { "import-fresh": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", - "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", + "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -4791,9 +4892,9 @@ } }, "eslint-module-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz", - "integrity": "sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", + "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", "requires": { "debug": "^2.6.8", "pkg-dir": "^2.0.0" @@ -5038,9 +5139,9 @@ } }, "eslint-plugin-react-hooks": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.6.0.tgz", - "integrity": "sha512-lHBVRIaz5ibnIgNG07JNiAuBUeKhEf8l4etNx5vfAEwqQ5tcuK3jV9yjmopPgQDagQb7HwIuQVsE3IVcGrRnag==" + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.6.1.tgz", + "integrity": "sha512-wHhmGJyVuijnYIJXZJHDUF2WM+rJYTjulUTqF9k61d3BTk8etydz+M4dXUVH7M76ZRS85rqBTCx0Es/lLsrjnA==" }, "eslint-scope": { "version": "4.0.3", @@ -5052,9 +5153,12 @@ } }, "eslint-utils": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", - "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.0.tgz", + "integrity": "sha512-7ehnzPaP5IIEh1r1tkjuIrxqhNkzUJa9z3R92tLJdZIVdWaczEhr3EbhGtsMrVxi1KeR8qA7Off6SWc5WNQqyQ==", + "requires": { + "eslint-visitor-keys": "^1.0.0" + } }, "eslint-visitor-keys": { "version": "1.0.0", @@ -5217,38 +5321,38 @@ } }, "express": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", - "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", "requires": { - "accepts": "~1.3.5", + "accepts": "~1.3.7", "array-flatten": "1.1.1", - "body-parser": "1.18.3", - "content-disposition": "0.5.2", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", "content-type": "~1.0.4", - "cookie": "0.3.1", + "cookie": "0.4.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.1.1", + "finalhandler": "~1.1.2", "fresh": "0.5.2", "merge-descriptors": "1.0.1", "methods": "~1.1.2", "on-finished": "~2.3.0", - "parseurl": "~1.3.2", + "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.4", - "qs": "6.5.2", - "range-parser": "~1.2.0", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", "safe-buffer": "5.1.2", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, @@ -5275,6 +5379,11 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" } } }, @@ -5303,9 +5412,9 @@ } }, "external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "requires": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -5387,9 +5496,9 @@ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, "fast-glob": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.6.tgz", - "integrity": "sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==", + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", "requires": { "@mrmlnc/readdir-enhanced": "^2.2.1", "@nodelib/fs.stat": "^1.1.2", @@ -5409,10 +5518,20 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, + "fast-memoize": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.1.tgz", + "integrity": "sha512-xdmw296PCL01tMOXx9mdJSmWY29jQgxyuZdq0rEHMu+Tpe1eOEtCycoG6chzlcrWsNgpZP7oL8RiQr7+G6Bl6g==" + }, + "fast-safe-stringify": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz", + "integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg==" + }, "faye-websocket": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", "requires": { "websocket-driver": ">=0.5.1" } @@ -5434,9 +5553,9 @@ } }, "fbjs": { - "version": "0.8.12", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz", - "integrity": "sha512-SBiP6XPiWIlX1tE5mvU/UeUFoqzJgbf+ezkl0M8D2xk4urDb+2uyjjGB10HAPluLboUqqVHtgUwwyuWakUfMgQ==", + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", "requires": { "core-js": "^1.0.0", "isomorphic-fetch": "^2.1.1", @@ -5444,13 +5563,13 @@ "object-assign": "^4.1.0", "promise": "^7.1.1", "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.9" + "ua-parser-js": "^0.7.18" }, "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" } } }, @@ -5485,9 +5604,9 @@ } }, "file-saver": { - "version": "1.3.8", - "resolved": "http://registry.npmjs.org/file-saver/-/file-saver-1.3.8.tgz", - "integrity": "sha512-spKHSBQIxxS81N/O21WmuXA2F6wppUCsutpzenOeZzOCCJ5gEfcbqJP983IrpLXzYmXnMUa6J03SubcNPdKrlg==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.2.tgz", + "integrity": "sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw==" }, "filesize": { "version": "3.6.1", @@ -5516,16 +5635,16 @@ } }, "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", "unpipe": "~1.0.0" }, "dependencies": { @@ -5573,9 +5692,9 @@ } }, "flatted": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", - "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==" }, "flatten": { "version": "1.0.2", @@ -5700,6 +5819,20 @@ "readable-stream": "^2.0.0" } }, + "frontend-collective-react-dnd-scrollzone": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/frontend-collective-react-dnd-scrollzone/-/frontend-collective-react-dnd-scrollzone-1.0.2.tgz", + "integrity": "sha512-me/D9PZJq9j/sjEjs/OPmm6V6nbaHbhgeQiwrWu0t35lhwAOKWc+QBzzKKcZQeboYTkgE8UvCD9el+5ANp+g5Q==", + "requires": { + "hoist-non-react-statics": "^3.1.0", + "lodash.throttle": "^4.0.1", + "prop-types": "^15.5.9", + "raf": "^3.2.0", + "react": "^16.3.0", + "react-display-name": "^0.2.0", + "react-dom": "^16.3.0" + } + }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -5751,9 +5884,9 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, "gaugeJS": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/gaugeJS/-/gaugeJS-1.3.6.tgz", - "integrity": "sha1-ZZEzRNsl/sdeS6kxTHxzlwtRR68=" + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/gaugeJS/-/gaugeJS-1.3.7.tgz", + "integrity": "sha512-te8IYMlgZOSbDmiecCwI+IOEUvEhYbniC+2qicPz7Bco5XV05QMtUr8ILqPuR+txtPC5855dZZojUHi0r15oWQ==" }, "get-caller-file": { "version": "1.0.3", @@ -5886,15 +6019,20 @@ } }, "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==" }, "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" }, + "gud": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" + }, "gzip-size": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.0.0.tgz", @@ -5991,11 +6129,6 @@ "kind-of": "^4.0.0" }, "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", @@ -6024,34 +6157,6 @@ "minimalistic-assert": "^1.0.1" } }, - "hast-util-from-parse5": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.0.tgz", - "integrity": "sha512-A7ev5OseS/J15214cvDdcI62uwovJO2PB60Xhnq7kaxvvQRFDEccuqbkrFXU03GPBGopdPqlpQBRqIcDS/Fjbg==", - "requires": { - "ccount": "^1.0.3", - "hastscript": "^5.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.1.2", - "xtend": "^4.0.1" - } - }, - "hast-util-parse-selector": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.1.tgz", - "integrity": "sha512-Xyh0v+nHmQvrOqop2Jqd8gOdyQtE8sIP9IQf7mlVDqp924W4w/8Liuguk2L2qei9hARnQSG2m+wAOCxM7npJVw==" - }, - "hastscript": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.0.0.tgz", - "integrity": "sha512-xJtuJ8D42Xtq5yJrnDg/KAIxl2cXBXKoiIJwmWX9XMf8113qHTGl/Bf7jEsxmENJ4w6q4Tfl8s/Y6mEZo8x8qw==", - "requires": { - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.2.0", - "property-information": "^5.0.1", - "space-separated-tokens": "^1.0.0" - } - }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -6086,9 +6191,12 @@ } }, "hoist-non-react-statics": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", + "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", + "requires": { + "react-is": "^16.7.0" + } }, "hosted-git-info": { "version": "2.7.1", @@ -6198,9 +6306,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", - "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -6215,20 +6323,28 @@ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" }, "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "requires": { "depd": "~1.1.2", "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } } }, "http-parser-js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", - "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==" + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=" }, "http-proxy": { "version": "1.17.0", @@ -6285,9 +6401,9 @@ "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" }, "icss-utils": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.0.tgz", - "integrity": "sha512-3DEun4VOeMvSczifM3F2cKQrDQ5Pj6WKhkOq6HD4QTnDUAq8MQRxy5TX6Sy1iY6WPBe4gQ3p5vTECjbIkglkkQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", "requires": { "postcss": "^7.0.14" } @@ -6326,9 +6442,9 @@ "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==" }, "immutable": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=" + "version": "4.0.0-rc.12", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0-rc.12.tgz", + "integrity": "sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A==" }, "import-cwd": { "version": "2.1.0", @@ -6374,11 +6490,6 @@ "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -6389,9 +6500,9 @@ } }, "inherits": { - "version": "2.0.3", - "resolved": false, - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.5", @@ -6399,9 +6510,9 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", - "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", + "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", "requires": { "ansi-escapes": "^3.2.0", "chalk": "^2.4.2", @@ -6409,7 +6520,7 @@ "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^2.0.0", - "lodash": "^4.17.11", + "lodash": "^4.17.12", "mute-stream": "0.0.7", "run-async": "^2.2.0", "rxjs": "^6.4.0", @@ -6497,9 +6608,9 @@ } }, "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-callable": { "version": "1.1.4", @@ -6624,11 +6735,6 @@ "path-is-inside": "^1.0.1" } }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -6955,6 +7061,11 @@ "xml-name-validator": "^3.0.0" } }, + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" + }, "whatwg-url": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", @@ -6993,9 +7104,9 @@ "integrity": "sha512-RR4fo8jEmMD9zSz2nLbs2j0zvPpk/KCEz3a62jJWbd2ayNo0cb+KFRxPHVhE4ZmgGJEQp0fosmNz84IfqM8cMQ==" }, "jest-haste-map": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.8.0.tgz", - "integrity": "sha512-ZBPRGHdPt1rHajWelXdqygIDpJx8u3xOoLyUBWRW28r3tagrgoepPrzAozW7kW9HrQfhvmiv1tncsxqHJO1onQ==", + "version": "24.8.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.8.1.tgz", + "integrity": "sha512-SwaxMGVdAZk3ernAx2Uv2sorA7jm3Kx+lR0grp6rMmnY06Kn/urtKx1LPN2mGTea4fCT38impYT28FfcLUhX0g==", "requires": { "@jest/types": "^24.8.0", "anymatch": "^2.0.0", @@ -7818,15 +7929,20 @@ } } }, + "jquery": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", + "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" + }, "js-levenshtein": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==" }, "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { "version": "3.13.1", @@ -7879,11 +7995,6 @@ "version": "5.7.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" - }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" } } }, @@ -7926,9 +8037,9 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" }, "json5": { "version": "2.1.0", @@ -7970,17 +8081,18 @@ } }, "jsx-ast-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.1.0.tgz", - "integrity": "sha512-yDGDG2DS4JcqhA6blsuYbtsT09xL8AoLuUR2Gb5exrw7UEM19sBcOTq+YBBhrNbl0PUC4R4LnFu+dHg2HKeVvA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz", + "integrity": "sha512-v3FxCcAf20DayI+uxnCuw795+oOIkVu6EnJ1+kSzhqqTZHNkTZ7B66ZgLp4oLJ/gbA64cI0B7WRoHZMSRdyVRQ==", "requires": { - "array-includes": "^3.0.3" + "array-includes": "^3.0.3", + "object.assign": "^4.1.0" } }, "jszip": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.1.tgz", - "integrity": "sha512-iCMBbo4eE5rb1VCpm5qXOAaUiRKRUKiItn8ah2YQQx9qymmSAY98eyQfioChEYcVQLh0zxJ3wS4A0mh90AVPvw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", + "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", "requires": { "lie": "~3.3.0", "pako": "~1.0.2", @@ -7988,6 +8100,11 @@ "set-immediate-shim": "~1.0.1" } }, + "keycode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", + "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ=" + }, "killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", @@ -7999,13 +8116,6 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { "is-buffer": "^1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - } } }, "kleur": { @@ -8066,6 +8176,11 @@ "immediate": "~3.0.5" } }, + "linear-layout-vector": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/linear-layout-vector/-/linear-layout-vector-0.0.1.tgz", + "integrity": "sha1-OYEU1zA7bsx/1rJzr3uEAdi6nHA=" + }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -8163,14 +8278,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" - }, - "lodash-es": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.11.tgz", - "integrity": "sha512-DHb1ub+rMjjrxqlB3H56/6MXtm1lSksDp2rA2cNWjG8mlDUYFhUj3Di2Zn5IwSU87xLv8tNIQ7sSwE/YOX/D/Q==" + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, "lodash._getnative": { "version": "3.9.1", @@ -8205,7 +8315,7 @@ "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" }, "lodash.keys": { "version": "3.1.2", @@ -8233,25 +8343,25 @@ "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=" }, "lodash.template": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", - "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", "requires": { - "lodash._reinterpolate": "~3.0.0", + "lodash._reinterpolate": "^3.0.0", "lodash.templatesettings": "^4.0.0" } }, "lodash.templatesettings": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", - "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", "requires": { - "lodash._reinterpolate": "~3.0.0" + "lodash._reinterpolate": "^3.0.0" } }, "lodash.throttle": { "version": "4.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" }, "lodash.unescape": { @@ -8265,16 +8375,16 @@ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, "loglevel": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", - "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=" + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.3.tgz", + "integrity": "sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA==" }, "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "requires": { - "js-tokens": "^3.0.0" + "js-tokens": "^3.0.0 || ^4.0.0" } }, "lower-case": { @@ -8356,9 +8466,9 @@ } }, "mdn-data": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", - "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" }, "media-typer": { "version": "0.3.0", @@ -8421,13 +8531,13 @@ }, "methods": { "version": "1.1.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "microevent.ts": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.0.tgz", - "integrity": "sha1-OQdIuKUVCD5rY81REqPxjC/g66g=" + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" }, "micromatch": { "version": "3.1.10", @@ -8466,9 +8576,9 @@ } }, "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" }, "mime-db": { "version": "1.40.0", @@ -8488,6 +8598,16 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, + "mini-create-react-context": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz", + "integrity": "sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw==", + "requires": { + "@babel/runtime": "^7.4.0", + "gud": "^1.0.0", + "tiny-warning": "^1.0.2" + } + }, "mini-css-extract-plugin": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz", @@ -8539,9 +8659,9 @@ } }, "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -8602,9 +8722,9 @@ } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multicast-dns": { "version": "6.2.3", @@ -8626,9 +8746,9 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, "nan": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", - "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", "optional": true }, "nanomatch": { @@ -8685,19 +8805,12 @@ } }, "node-fetch": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.1.tgz", - "integrity": "sha512-j8XsFGCLw79vWXkZtMSmmLaOk9z5SQ9bV/tkbZVCqvgwzrjAGq66igobLofHtF63NvMTp2WjytpsNTGKa+XRIQ==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", "requires": { "encoding": "^0.1.11", "is-stream": "^1.0.1" - }, - "dependencies": { - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - } } }, "node-forge": { @@ -8711,9 +8824,9 @@ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" }, "node-libs-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", - "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", "requires": { "assert": "^1.1.1", "browserify-zlib": "^0.2.0", @@ -8725,7 +8838,7 @@ "events": "^3.0.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", + "path-browserify": "0.0.1", "process": "^0.11.10", "punycode": "^1.2.4", "querystring-es3": "^0.2.0", @@ -8737,7 +8850,7 @@ "tty-browserify": "0.0.0", "url": "^0.11.0", "util": "^0.11.0", - "vm-browserify": "0.0.4" + "vm-browserify": "^1.0.1" }, "dependencies": { "punycode": { @@ -8772,9 +8885,9 @@ } }, "node-releases": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.19.tgz", - "integrity": "sha512-SH/B4WwovHbulIALsQllAVwqZZD1kPmKCqrhGfR29dXjLAVZMHvBjD3S6nL9D/J9QkmZ1R92/0wCMDKXUUvyyA==", + "version": "1.1.25", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.25.tgz", + "integrity": "sha512-fI5BXuk83lKEoZDdH3gRhtsNgh05/wZacuXkgbiYkceE7+QIMXOg98n9ZV7mz27B+kFHnqHcUpscZZlGRSmTpQ==", "requires": { "semver": "^5.3.0" }, @@ -8860,7 +8973,7 @@ }, "object-assign": { "version": "4.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-copy": { @@ -8995,7 +9108,7 @@ }, "optimist": { "version": "0.6.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "requires": { "minimist": "~0.0.1", @@ -9174,9 +9287,9 @@ } }, "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" }, "parseurl": { "version": "1.3.3", @@ -9189,9 +9302,9 @@ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" }, "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" }, "path-dirname": { "version": "1.0.2", @@ -9225,7 +9338,7 @@ }, "path-to-regexp": { "version": "1.7.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", "requires": { "isarray": "0.0.1" @@ -9266,7 +9379,7 @@ }, "performance-now": { "version": "2.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pify": { @@ -9364,10 +9477,15 @@ "ts-pnp": "^1.0.0" } }, + "popper.js": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.15.0.tgz", + "integrity": "sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA==" + }, "portfinder": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", - "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", + "version": "1.0.21", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.21.tgz", + "integrity": "sha512-ESabpDCzmBS3ekHbmpAIiESq3udRsCBGiBZLsC+HgBKv2ezb0R4oG+7RnYEVZ/ZCfhel5Tx3UzdNWA0Lox2QCA==", "requires": { "async": "^1.5.2", "debug": "^2.2.0", @@ -9395,9 +9513,9 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { - "version": "7.0.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", - "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", "requires": { "chalk": "^2.4.2", "source-map": "^0.6.1", @@ -9553,11 +9671,11 @@ } }, "postcss-custom-properties": { - "version": "8.0.10", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.10.tgz", - "integrity": "sha512-GDL0dyd7++goDR4SSasYdRNNvp4Gqy1XMzcCnTijiph7VB27XXpJ8bW/AI0i2VSBZ55TpdGhMr37kMSpRfYD0Q==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", "requires": { - "postcss": "^7.0.14", + "postcss": "^7.0.17", "postcss-values-parser": "^2.0.1" } }, @@ -9713,11 +9831,11 @@ } }, "postcss-initial": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.0.tgz", - "integrity": "sha512-WzrqZ5nG9R9fUtrA+we92R4jhVvEB32IIRTzfIG/PLL8UV4CvbF1ugTEHEFX6vWxl41Xt5RTCJPEZkuWzrOM+Q==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.1.tgz", + "integrity": "sha512-I2Sz83ZSHybMNh02xQDK609lZ1/QOyYeuizCjzEhlMgeV/HcDJapQiH4yTqLjZss0X6/6VvKFXUeObaHpJoINw==", "requires": { - "lodash.template": "^4.2.4", + "lodash.template": "^4.5.0", "postcss": "^7.0.2" } }, @@ -9732,25 +9850,12 @@ } }, "postcss-load-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", - "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", "requires": { - "cosmiconfig": "^4.0.0", + "cosmiconfig": "^5.0.0", "import-cwd": "^2.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" - } - } } }, "postcss-loader": { @@ -10272,9 +10377,9 @@ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" }, "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==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "progress": { "version": "2.0.3", @@ -10295,9 +10400,9 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" }, "prompts": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.0.4.tgz", - "integrity": "sha512-HTzM3UWp/99A0gk51gAegwo1QRYA7xjcZufMNe33rCclFszUYAuHe1fIN/3ZmiHeGPkUsNaRyQm1hHOfM0PKxA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.1.0.tgz", + "integrity": "sha512-+x5TozgqYdOwWsQFZizE/Tra3fKvAoy037kOyU6cgz84n8f6zxngLOV4O32kTwt9FcLCxAqw0P/c8rOr9y+Gfg==", "requires": { "kleur": "^3.0.2", "sisteransi": "^1.0.0" @@ -10311,24 +10416,25 @@ "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.8.1" - }, - "dependencies": { - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - } } }, - "property-information": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.1.0.tgz", - "integrity": "sha512-tODH6R3+SwTkAQckSp2S9xyYX8dEKYkeXw+4TmJzTxnNzd6mQPu1OD4f9zPrvw/Rm4wpPgI+Zp63mNSGNzUgHg==", + "prop-types-extra": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.0.tgz", + "integrity": "sha512-QFyuDxvMipmIVKD2TwxLVPzMnO4e5oOf1vr3tJIomL8E7d0lr6phTHd5nkPhFIzTD1idBLLEPeylL9g+rrTzRg==", "requires": { - "xtend": "^4.0.1" + "react-is": "^16.3.2", + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + } } }, "proxy-addr": { @@ -10346,9 +10452,9 @@ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" }, "psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz", + "integrity": "sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA==" }, "public-encrypt": { "version": "4.0.3", @@ -10429,9 +10535,9 @@ "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" }, "raf": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", - "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", "requires": { "performance-now": "^2.1.0" } @@ -10459,23 +10565,20 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, "dependencies": { - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" } } }, @@ -10491,22 +10594,23 @@ } }, "rc-animate": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rc-animate/-/rc-animate-2.8.2.tgz", - "integrity": "sha512-JUKpst+OSDFQjqhhZliBcmO3Fie1SeiIxsEhS7PbZVz/UjCC8uDtp31+NRxidxy3BnfXbbfZdtG9mNWIDqIfTw==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/rc-animate/-/rc-animate-2.9.2.tgz", + "integrity": "sha512-rkJjeJgfbDqVjVX1/QTRfS7PiCq3AnmeYo840cVcuC4pXq4k4yAQMsC2v5BPXXdawC04vnyO4/qHQdbx9ANaiw==", "requires": { "babel-runtime": "6.x", "classnames": "^2.2.6", "css-animation": "^1.3.2", "prop-types": "15.x", "raf": "^3.4.0", + "rc-util": "^4.8.0", "react-lifecycles-compat": "^3.0.4" } }, "rc-slider": { - "version": "8.6.11", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-8.6.11.tgz", - "integrity": "sha512-k6dPXA7NkjSp5NCyjAJbRxnttj/U7qEMydT2Y/VY64INyoznMx968xz8s4KX1iTiTA69X7EBMD5TWM3cdsfzRg==", + "version": "8.6.13", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-8.6.13.tgz", + "integrity": "sha512-fCUe8pPn8n9pq1ARX44nN2nzJoATtna4x/PdskUrxIvZXN8ja7HuceN/hq6kokZjo3FBD2B1yMZvZh6oi68l6Q==", "requires": { "babel-runtime": "6.x", "classnames": "^2.2.5", @@ -10528,26 +10632,28 @@ } }, "rc-trigger": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-2.6.2.tgz", - "integrity": "sha512-op4xCu95/gdHVaysyxxiYxbY+Z+UcIBSUY9nQfLqm1FlitdtnAN+owD5iMPfnnsRXntgcQ5+RdYKNUFQT5DjzA==", + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-2.6.5.tgz", + "integrity": "sha512-m6Cts9hLeZWsTvWnuMm7oElhf+03GOjOLfTuU0QmdB9ZrW7jR2IpI5rpNM7i9MvAAlMAmTx5Zr7g3uu/aMvZAw==", "requires": { "babel-runtime": "6.x", "classnames": "^2.2.6", "prop-types": "15.x", "rc-align": "^2.4.0", "rc-animate": "2.x", - "rc-util": "^4.4.0" + "rc-util": "^4.4.0", + "react-lifecycles-compat": "^3.0.4" } }, "rc-util": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.6.0.tgz", - "integrity": "sha512-rbgrzm1/i8mgfwOI4t1CwWK7wGe+OwX+dNa7PVMgxZYPBADGh86eD4OcJO1UKGeajIMDUUKMluaZxvgraQIOmw==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.8.2.tgz", + "integrity": "sha512-EXKOIvhMYABd4Ww1NQF++YKgzyMPz6VWvD/FIVqTUJR+3AGTuXDEzOPZ9/jMRkQcNS9aqpuRXc3Ad8cPVIMMQA==", "requires": { "add-dom-event-listener": "^1.1.0", "babel-runtime": "6.x", "prop-types": "^15.5.10", + "react-lifecycles-compat": "^3.0.4", "shallowequal": "^0.2.2" }, "dependencies": { @@ -10562,9 +10668,12 @@ } }, "re-resizable": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-4.5.1.tgz", - "integrity": "sha512-amjlp4IuTSHs4XG1bP5WbAgBDIZitODKIsqcpZsNhEBYYEidol0dlP4S9zHiN3iu6Tff4WfYuruihLgN7RJeQw==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-5.0.1.tgz", + "integrity": "sha512-Iy8v5li7bhNBDxCN1DbA4l6G2Hk8NCZtcExoI1D+5pfvKyQcH8LH2P5h3DGoEfHhs0uyyRC1Qx8bHBomfrmxgA==", + "requires": { + "fast-memoize": "^2.5.1" + } }, "react": { "version": "16.8.6", @@ -10603,23 +10712,10 @@ "asap": "~2.0.6" } }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "requires": { - "performance-now": "^2.1.0" - } - }, "regenerator-runtime": { "version": "0.13.2", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" - }, - "whatwg-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" } } }, @@ -10635,154 +10731,41 @@ } }, "react-bootstrap": { - "version": "0.31.5", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-0.31.5.tgz", - "integrity": "sha512-xgDihgX4QvYHmHzL87faDBMDnGfYyqcrqV0TEbWY+JizePOG1vfb8M3xJN+6MJ3kUYqDtQSZ7v/Q6Y5YDrkMdA==", + "version": "1.0.0-beta.9", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.0.0-beta.9.tgz", + "integrity": "sha512-M0BYLuuUdMITJ16+DDDb1p4vWV87csEBi/uOxZYODuDZh7hvbrJVahfvPXcqeqq4eEpNL+PKSlqb9fNaY0HZyA==", "requires": { - "babel-runtime": "^6.11.6", - "classnames": "^2.2.5", - "dom-helpers": "^3.2.0", - "invariant": "^2.2.1", - "keycode": "^2.1.2", - "prop-types": "^15.5.10", - "prop-types-extra": "^1.0.1", - "react-overlays": "^0.7.4", - "uncontrollable": "^4.1.0", - "warning": "^3.0.0" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" - }, - "dom-helpers": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.3.1.tgz", - "integrity": "sha512-2Sm+JaYn74OiTM2wHvxJOo3roiq/h25Yi69Fqk269cNUwIXsCvATB6CRSFC9Am/20G2b28hGv/+7NiWydIrPvg==" - }, - "fbjs": { - "version": "0.8.16", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", - "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", - "requires": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.9" - }, - "dependencies": { - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "keycode": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.1.9.tgz", - "integrity": "sha1-lkojxU5IiUBbSGGlyfBIDUUUHfo=" - }, - "prop-types": { - "version": "15.6.0", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", - "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", - "requires": { - "fbjs": "^0.8.16", - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "prop-types-extra": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.0.1.tgz", - "integrity": "sha1-pXvUgQ6C0no/9DF+zBtK0AX3moI=", - "requires": { - "warning": "^3.0.0" - } - }, - "react-overlays": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-0.7.4.tgz", - "integrity": "sha512-7vsooMx3siLAuEfTs8FYeP/lAORWWFXTO8PON3KgX0Htq1Oa+po6ioSjGyO0/GO5CVSMNhpWt6V2opeexHgBuQ==", - "requires": { - "classnames": "^2.2.5", - "dom-helpers": "^3.2.1", - "prop-types": "^15.5.10", - "prop-types-extra": "^1.0.1", - "warning": "^3.0.0" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "ua-parser-js": { - "version": "0.7.17", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", - "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==" - }, - "uncontrollable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-4.1.0.tgz", - "integrity": "sha1-4DWCkSUuGGUiLZCTmxny9J+Bwak=", - "requires": { - "invariant": "^2.1.0" - } - }, - "warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", - "requires": { - "loose-envify": "^1.0.0" - } - } + "@babel/runtime": "^7.4.2", + "@react-bootstrap/react-popper": "1.2.1", + "@restart/context": "^2.1.4", + "@restart/hooks": "^0.3.0", + "classnames": "^2.2.6", + "dom-helpers": "^3.4.0", + "invariant": "^2.2.4", + "keycode": "^2.2.0", + "popper.js": "^1.14.7", + "prop-types": "^15.7.2", + "prop-types-extra": "^1.1.0", + "react-overlays": "^1.2.0", + "react-transition-group": "^4.0.0", + "uncontrollable": "^6.1.0", + "warning": "^4.0.3" } }, "react-contexify": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/react-contexify/-/react-contexify-3.0.3.tgz", - "integrity": "sha512-Bk6r238FXKJptI2+bZff+JoyI1RTVW0ynv5hwlT+hrGFS81U5BGO5akzyWLXljFoJitHR20W/l6pSLasp7FeLQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/react-contexify/-/react-contexify-4.1.1.tgz", + "integrity": "sha512-WJeRI4ohHEOmNiH0xb62a/eV+5ae168FB7H6pfbeEVJkf0UN7D5H99l6b89poc2LHKN1gOimFjREyY8quGVsXA==", "requires": { - "classnames": "^2.2.5", - "prop-types": "^15.6.0" + "classnames": "^2.2.6", + "prop-types": "^15.6.2" } }, + "react-context-toolbox": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/react-context-toolbox/-/react-context-toolbox-2.0.2.tgz", + "integrity": "sha512-tY4j0imkYC3n5ZlYSgFkaw7fmlCp3IoQQ6DxpqeNHzcD0hf+6V+/HeJxviLUZ1Rv1Yn3N3xyO2EhkkZwHn0m1A==" + }, "react-d3": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/react-d3/-/react-d3-0.4.0.tgz", @@ -10824,6 +10807,14 @@ "text-table": "0.2.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "requires": { + "@babel/highlight": "^7.0.0" + } + }, "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", @@ -10870,48 +10861,28 @@ } }, "react-display-name": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/react-display-name/-/react-display-name-0.2.3.tgz", - "integrity": "sha1-9QIE1DDJyoGbwLreAwbpF12NGYc=" + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/react-display-name/-/react-display-name-0.2.4.tgz", + "integrity": "sha512-zvU6iouW+SWwHTyThwxGICjJYCMZFk/6r/+jmOdC7ntQoPlS/Pqb81MkxaMf2bHTSq9TN3K3zX2/ayMW/jCtyA==" }, "react-dnd": { - "version": "2.6.0", - "resolved": "http://registry.npmjs.org/react-dnd/-/react-dnd-2.6.0.tgz", - "integrity": "sha1-f6JWds+CfViokSk+PBq1naACVFo=", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-9.3.2.tgz", + "integrity": "sha512-3xwrd+z25CplNmO1j6BmvFlL72fK0IjW0WqCV7NCYLvKCjomZLhf3ZPAfCyCOSP9riTglnh53OV47M3ydo25ZA==", "requires": { - "disposables": "^1.0.1", - "dnd-core": "^2.6.0", - "hoist-non-react-statics": "^2.1.0", - "invariant": "^2.1.0", - "lodash": "^4.2.0", - "prop-types": "^15.5.10" - }, - "dependencies": { - "hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" - } + "@types/hoist-non-react-statics": "^3.3.1", + "@types/shallowequal": "^1.1.1", + "dnd-core": "^9.3.2", + "hoist-non-react-statics": "^3.3.0", + "shallowequal": "^1.1.0" } }, "react-dnd-html5-backend": { - "version": "2.6.0", - "resolved": "http://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-2.6.0.tgz", - "integrity": "sha1-WQzRzKeEQbsnTt1XH+9MCxbdz44=", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-9.3.2.tgz", + "integrity": "sha512-EsQLA3fikHxkkvs6COnEdo3McJg2Q82z6EQxo7s3yqez4LAutrcp7pf5/eyW1nFDcdN3JNx2p+TrkjVjEd5exw==", "requires": { - "lodash": "^4.2.0" - } - }, - "react-dnd-scrollzone": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/react-dnd-scrollzone/-/react-dnd-scrollzone-4.0.0.tgz", - "integrity": "sha512-yu9Z/K/7Fy4MtlGYp5eoaZY+Zz+wOccWdC98IeiMvkgoEP+YsC6UCjjMoZMJdeqpi8f1j3agPb4D5uB1OCwuKg==", - "requires": { - "hoist-non-react-statics": "^1.2.0", - "lodash.throttle": "^4.0.1", - "prop-types": "^15.5.9", - "raf": "^3.2.0", - "react-display-name": "^0.2.0" + "dnd-core": "^9.3.2" } }, "react-dom": { @@ -10940,9 +10911,9 @@ "integrity": "sha512-X1Y+0jR47ImDVr54Ab6V9eGk0Hnu7fVWGeHQSOXHf/C2pF9c6uy3gef8QUeuUiWlNb0i08InPSE5a/KJzNzw1Q==" }, "react-fullscreenable": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/react-fullscreenable/-/react-fullscreenable-2.5.0.tgz", - "integrity": "sha512-z03SBarLfdZjWzK/nARyuylLBJnii1nnkCgU/JA1QOpav7lF7RbX3w+vTQ/9ZutOAo4clPXDtpYeb2xXurY6fA==", + "version": "2.5.1-0", + "resolved": "https://registry.npmjs.org/react-fullscreenable/-/react-fullscreenable-2.5.1-0.tgz", + "integrity": "sha512-E399l6uddp6IP95TtIuQH2emOHFRubKtjGBR86eH11FWGPQ6tcoG1Yajd0ZggWb+x+cDGgFtAoDTOqTMDUA+yA==", "requires": { "classnames": "^2.2.5", "fullscreen": "^1.1.1", @@ -10980,47 +10951,89 @@ "prop-types": "^15.5.6" } }, - "react-rnd": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-7.4.3.tgz", - "integrity": "sha512-TLQ35nqXup7rC63qAETebbO6Znilr20CroTTeAdlYu8nvRSwB7BrmPKZhHB2GgeiSucOoeCyAA9pHPhbMpEd/Q==", + "react-overlays": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-1.2.0.tgz", + "integrity": "sha512-i/FCV8wR6aRaI+Kz/dpJhOdyx+ah2tN1RhT9InPrexyC4uzf3N4bNayFTGtUeQVacj57j1Mqh1CwV60/5153Iw==", "requires": { - "re-resizable": "4.5.1", - "react-draggable": "^3.0.5" + "classnames": "^2.2.6", + "dom-helpers": "^3.4.0", + "prop-types": "^15.6.2", + "prop-types-extra": "^1.1.0", + "react-context-toolbox": "^2.0.2", + "react-popper": "^1.3.2", + "uncontrollable": "^6.0.0", + "warning": "^4.0.2" } }, - "react-router": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", - "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", + "react-popper": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.3.tgz", + "integrity": "sha512-ynMZBPkXONPc5K4P5yFWgZx5JGAUIP3pGGLNs58cfAPgK67olx7fmLp+AdpZ0+GoQ+ieFDa/z4cdV6u7sioH6w==", "requires": { - "history": "^4.7.2", - "hoist-non-react-statics": "^2.5.0", - "invariant": "^2.2.4", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", + "@babel/runtime": "^7.1.2", + "create-react-context": "<=0.2.2", + "popper.js": "^1.14.4", "prop-types": "^15.6.1", - "warning": "^4.0.1" + "typed-styles": "^0.0.7", + "warning": "^4.0.2" }, "dependencies": { - "hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + "create-react-context": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.2.tgz", + "integrity": "sha512-KkpaLARMhsTsgp0d2NA/R94F/eDLbhXERdIq3LvX2biCAXcDvHYoOqHfWCHf1+OLj+HKBotLG3KqaOOf+C1C+A==", + "requires": { + "fbjs": "^0.8.0", + "gud": "^1.0.0" + } + }, + "typed-styles": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", + "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==" } } }, - "react-router-dom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.3.1.tgz", - "integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==", + "react-rnd": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.0.0.tgz", + "integrity": "sha512-JLN5f17dvp8niAvNPSiPgbdXyOgMXz/0ADs8feBtE7C+lkvsfrvvzvudhGJnpe7Rd9kXW/MWEJHvkEmKkdN8aQ==", "requires": { - "history": "^4.7.2", - "invariant": "^2.2.4", + "re-resizable": "5.0.1", + "react-draggable": "3.3.0", + "tslib": "1.10.0" + } + }, + "react-router": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.0.1.tgz", + "integrity": "sha512-EM7suCPNKb1NxcTZ2LEOWFtQBQRQXecLxVpdsP4DW4PbbqYWeRiLyV/Tt1SdCrvT2jcyXAXmVTmzvSzrPR63Bg==", + "requires": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", "loose-envify": "^1.3.1", - "prop-types": "^15.6.1", - "react-router": "^4.3.1", - "warning": "^4.0.1" + "mini-create-react-context": "^0.3.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + } + }, + "react-router-dom": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.0.1.tgz", + "integrity": "sha512-zaVHSy7NN0G91/Bz9GD4owex5+eop+KvgbxXsP/O+iW1/Ln+BrJ8QiIR5a6xNPtrdTvLkxqlDClx13QO1uB8CA==", + "requires": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.0.1", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" } }, "react-scripts": { @@ -11084,45 +11097,92 @@ } }, "react-sortable-tree": { - "version": "0.1.21", - "resolved": "https://registry.npmjs.org/react-sortable-tree/-/react-sortable-tree-0.1.21.tgz", - "integrity": "sha1-JqBd4gEv+kalpNsrcSdDcSV9rrg=", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/react-sortable-tree/-/react-sortable-tree-2.6.2.tgz", + "integrity": "sha512-mYX6ByTs7fywPqTEWpEUMgtvLDVyVrkm1Tw/pOPteiLwwMnOqh1LxBwJPUJBmhU2E0P2Zvw3dhnBFL14Fe4EkA==", "requires": { - "lodash.isequal": "^4.4.0", - "prop-types": "^15.5.8", - "react-dnd": "^2.1.4", - "react-dnd-html5-backend": "^2.1.2", - "react-dnd-scrollzone": "^4.0.0", - "react-virtualized": "^9.9.0" + "frontend-collective-react-dnd-scrollzone": "^1.0.2", + "lodash.isequal": "^4.5.0", + "prop-types": "^15.6.1", + "react-dnd": "^7.3.0", + "react-dnd-html5-backend": "^7.0.1", + "react-lifecycles-compat": "^3.0.4", + "react-sortable-tree": "^2.6.0", + "react-virtualized": "^9.19.1" + }, + "dependencies": { + "dnd-core": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-7.7.0.tgz", + "integrity": "sha512-+YqwflWEY1MEAEl2QiEiRaglYkCwIZryyQwximQGuTOm/ns7fS6Lg/i7OCkrtjM10D5FhArf/VUHIL4ZaRBK0g==", + "requires": { + "asap": "^2.0.6", + "invariant": "^2.2.4", + "redux": "^4.0.1" + } + }, + "react-dnd": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-7.7.0.tgz", + "integrity": "sha512-anpJDKMgdXE6kXvtBFmIAe1fuaexpVy7meUyNjiTfCnjQ1mRvnttGTVvcW9fMKijsUQYadiyvzd3BRxteFuVXg==", + "requires": { + "@types/hoist-non-react-statics": "^3.3.1", + "dnd-core": "^7.7.0", + "hoist-non-react-statics": "^3.3.0", + "invariant": "^2.1.0", + "shallowequal": "^1.1.0" + } + }, + "react-dnd-html5-backend": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-7.7.0.tgz", + "integrity": "sha512-JgKmWOxqorFyfGPeWV+SAPhVGFe6+LrOR24jETE9rrYZU5hCppzwK9ujjS508kWibeDvbfEgi9j5qC2wB1/MoQ==", + "requires": { + "dnd-core": "^7.7.0" + } + } } }, "react-svg-pan-zoom": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/react-svg-pan-zoom/-/react-svg-pan-zoom-2.18.0.tgz", - "integrity": "sha1-HwM9nbHIK5u0lOIZYjcnb2lOesk=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/react-svg-pan-zoom/-/react-svg-pan-zoom-3.1.0.tgz", + "integrity": "sha512-hmDUarqhNnCwuZumV9Pw7o5inW7lda4sX2U1vDK2B2slrSfNu1jbelOp6aaOEyUF7WzMA1xrpH6NBWvk4UeUTQ==", "requires": { - "prop-types": "^15.6.2", - "transformation-matrix": "^1.12.0" + "prop-types": "^15.7.2", + "transformation-matrix": "^2.0.0" } }, "react-textarea-autosize": { "version": "6.1.0", - "resolved": "http://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-6.1.0.tgz", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-6.1.0.tgz", "integrity": "sha512-F6bI1dgib6fSvG8so1HuArPUv+iVEfPliuLWusLF+gAKz0FbB4jLrWUrTAeq1afnPT2c9toEZYUdz/y1uKMy4A==", "requires": { "prop-types": "^15.6.0" } }, - "react-virtualized": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.9.0.tgz", - "integrity": "sha512-TDe2haZiFr5apN3myuumGyeJ7iqHcGcQ648tfNf9x+R6tkE1+o8yAmeh4nKC4ldcs9My1dOHN3x/lmEX9LyOLA==", + "react-transition-group": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.2.1.tgz", + "integrity": "sha512-IXrPr93VzCPupwm2O6n6C2kJIofJ/Rp5Ltihhm9UfE8lkuVX2ng/SUUl/oWjblybK9Fq2Io7LGa6maVqPB762Q==", "requires": { - "babel-runtime": "^6.11.6", - "classnames": "^2.2.3", + "@babel/runtime": "^7.4.5", + "dom-helpers": "^3.4.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, + "react-virtualized": { + "version": "9.21.1", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.21.1.tgz", + "integrity": "sha512-E53vFjRRMCyUTEKuDLuGH1ld/9TFzjf/fFW816PE4HFXWZorESbSTYtiZz1oAjra0MminaUU1EnvUxoGuEFFPA==", + "requires": { + "babel-runtime": "^6.26.0", + "clsx": "^1.0.1", "dom-helpers": "^2.4.0 || ^3.0.0", + "linear-layout-vector": "0.0.1", "loose-envify": "^1.3.0", - "prop-types": "^15.5.4" + "prop-types": "^15.6.0", + "react-lifecycles-compat": "^3.0.4" } }, "read-pkg": { @@ -11185,14 +11245,12 @@ } }, "redux": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", - "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.4.tgz", + "integrity": "sha512-vKv4WdiJxOWKxK0yRoaK3Y4pxxB0ilzVx6dszU2W8wLxlb2yikRph4iV/ymtdJ6ZxpBLFbyrxklnT5yBbQSl3Q==", "requires": { - "lodash": "^4.2.1", - "lodash-es": "^4.2.1", - "loose-envify": "^1.1.0", - "symbol-observable": "^1.0.3" + "loose-envify": "^1.4.0", + "symbol-observable": "^1.2.0" } }, "regenerate": { @@ -11214,9 +11272,9 @@ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" }, "regenerator-transform": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.4.tgz", - "integrity": "sha512-T0QMBjK3J0MtxjPmdIMXm72Wvj2Abb0Bd4HADdfijwMdoIsyQZ6fWC7kDFhk2YinBBEMZDL7Y7wh0J1sGx3S4A==", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", + "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", "requires": { "private": "^0.1.6" } @@ -11231,9 +11289,9 @@ } }, "regexp-tree": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.6.tgz", - "integrity": "sha512-LFrA98Dw/heXqDojz7qKFdygZmFoiVlvE1Zp7Cq2cvF+ZA+03Gmhy0k0PQlsC1jvHPiTUSs+pDHEuSWv6+6D7w==" + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.11.tgz", + "integrity": "sha512-7/l/DgapVVDzZobwMCCgMlqiqyLFJ0cduo/j+3BcDJIB+yJdsYCfKuI3l/04NV+H/rfNRdPIDbXNZHM9XvQatg==" }, "regexpp": { "version": "2.0.1", @@ -11273,16 +11331,6 @@ } } }, - "rehype-parse": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.0.tgz", - "integrity": "sha512-V2OjMD0xcSt39G4uRdMTqDXXm6HwkUbLMDayYKA/d037j8/OtVSQ+tqKwYWOuyBeoCs/3clXRe30VUjeMDTBSA==", - "requires": { - "hast-util-from-parse5": "^5.0.0", - "parse5": "^5.0.0", - "xtend": "^4.0.1" - } - }, "relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -11350,11 +11398,6 @@ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" - }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", @@ -11421,11 +11464,6 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -11514,9 +11552,9 @@ } }, "rsvp": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.4.tgz", - "integrity": "sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA==" + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" }, "run-async": { "version": "2.3.0", @@ -11650,11 +11688,11 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "saxes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.9.tgz", - "integrity": "sha512-FZeKhJglhJHk7eWG5YM0z46VHmI3KJpMBAQm3xa9meDvd+wevB5GuBB0wc0exPInZiBBHqi00DbS8AcvCGCFMw==", + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", "requires": { - "xmlchars": "^1.3.1" + "xmlchars": "^2.1.1" } }, "scheduler": { @@ -11695,9 +11733,9 @@ "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==" }, "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -11706,12 +11744,12 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" + "range-parser": "~1.2.1", + "statuses": "~1.5.0" }, "dependencies": { "debug": { @@ -11720,17 +11758,24 @@ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } } }, "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, @@ -11761,22 +11806,43 @@ "ms": "2.0.0" } }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" } } }, "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" + "parseurl": "~1.3.3", + "send": "0.17.1" } }, "set-blocking": { @@ -11790,9 +11856,9 @@ "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" }, "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -11816,9 +11882,9 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, "sha.js": { "version": "2.4.11", @@ -11840,11 +11906,6 @@ "mixin-object": "^2.0.1" }, "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, "kind-of": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", @@ -11915,9 +11976,9 @@ } }, "sisteransi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.0.tgz", - "integrity": "sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.2.tgz", + "integrity": "sha512-ZcYcZcT69nSLAR2oLN2JwNmLkJEKGooFMCdvOkFrToUt/WfcRWqhIg4P4KwY4dmLbuyXIx4o4YmPsvMRJYJd/w==" }, "slash": { "version": "2.0.0", @@ -12122,11 +12183,6 @@ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, - "space-separated-tokens": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.4.tgz", - "integrity": "sha512-UyhMSmeIqZrQn2UdjYpxEkwY9JUrn8pP+7L4f91zRzOQuI8MF1FGLfYU9DKCYeLdo7LXMxwrX5zKFy7eeeVHuA==" - }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", @@ -12151,9 +12207,9 @@ } }, "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==" + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" }, "spdy": { "version": "4.0.0", @@ -12181,9 +12237,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", - "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -12259,9 +12315,9 @@ } }, "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, "stealthy-require": { "version": "1.1.1", @@ -12403,34 +12459,42 @@ } }, "superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.1.0.tgz", + "integrity": "sha512-7V6JVx5N+eTL1MMqRBX0v0bG04UjrjAvvZJTF/VDH/SH2GjSLqlrcYepFlpTrXpm37aSY6h3GGVWGxXl/98TKA==", "requires": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.6", + "form-data": "^2.3.3", + "formidable": "^1.2.1", + "methods": "^1.1.2", + "mime": "^2.4.4", + "qs": "^6.7.0", + "readable-stream": "^3.4.0", + "semver": "^6.1.1" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", "requires": { - "ms": "^2.1.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "semver": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", + "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==" } } }, @@ -12442,17 +12506,21 @@ "has-flag": "^3.0.0" } }, + "svg-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.1.tgz", + "integrity": "sha512-8eUnCsU2sc2hyfvjK++zi5u24a2UQIB2DK9GY/cprGlaDr7SIhm9F0m9CkGYOnOgrK3iTUSnJ7M1DTLqqZt96g==" + }, "svgo": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.2.2.tgz", - "integrity": "sha512-rAfulcwp2D9jjdGu+0CuqlrAUin6bBWrpoqXWwKDZZZJfXcUXQSxLJOFJCQCSA0x0pP2U0TxSlJu2ROq5Bq6qA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.0.tgz", + "integrity": "sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ==", "requires": { "chalk": "^2.4.1", "coa": "^2.0.2", "css-select": "^2.0.0", "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.28", - "css-url-regex": "^1.1.0", + "css-tree": "1.0.0-alpha.33", "csso": "^3.5.1", "js-yaml": "^3.13.1", "mkdirp": "~0.5.1", @@ -12469,17 +12537,17 @@ "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" }, "symbol-tree": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", - "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "table": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/table/-/table-5.3.3.tgz", - "integrity": "sha512-3wUNCgdWX6PNpOe3amTTPWPuF6VGvgzjKCaO1snFj0z7Y3mUPWf5+zDtxUVGispJkDECPmR29wbzh6bVMOHbcw==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.4.tgz", + "integrity": "sha512-IIfEAUx5QlODLblLrGTTLJA7Tk0iLSGBvgY8essPRVNGHAzThujww1YqHLs6h3HfTg55h++RzLHH5Xw/rfv+mg==", "requires": { - "ajv": "^6.9.1", - "lodash": "^4.17.11", + "ajv": "^6.10.2", + "lodash": "^4.17.14", "slice-ansi": "^2.1.0", "string-width": "^3.0.0" }, @@ -12593,14 +12661,14 @@ "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" }, "tiny-invariant": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.0.4.tgz", - "integrity": "sha512-lMhRd/djQJ3MoaHEBrw8e2/uM4rs9YMNk0iOr8rHQ0QdbM7D4l0gFl3szKdeixrlyfm9Zqi4dxHCM2qVG8ND5g==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.0.6.tgz", + "integrity": "sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA==" }, "tiny-warning": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.2.tgz", - "integrity": "sha512-rru86D9CpQRLvsFG5XFdy0KdLAvjdQDyZCsRcuu60WtzFylDM3eAWSxEVz5kzL2Gp544XiUvPbVKtOA/txLi9Q==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, "tmp": { "version": "0.0.33", @@ -12653,6 +12721,11 @@ "repeat-string": "^1.6.1" } }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -12671,34 +12744,29 @@ } }, "transformation-matrix": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-1.15.3.tgz", - "integrity": "sha512-ThJH58GNFKhCw3gIoOtwf3tNwuYjbyEeiGdeq4mNMYWdJctnI896KUqn6PVt7jmNVepqa1bcKQtnMB1HtjsDMA==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-2.0.5.tgz", + "integrity": "sha512-S6L67Z8V3WEyPm2/zDh3I3bO0OQwv88dh7IY2dIOVBfIZJ4WQGdEKOsh7phTgYkvfAmHRxfOPNt1ixN/zR6D/A==" }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" }, - "trough": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.4.tgz", - "integrity": "sha512-tdzBRDGWcI1OpPVmChbdSKhvSVurznZ8X36AYURAcl+0o2ldlCY2XPzyXNNxwJwwyIU+rIglTCG4kxtNKBQH7Q==" - }, "ts-pnp": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.2.tgz", "integrity": "sha512-f5Knjh7XCyRIzoC/z1Su1yLLRrPrFCgtUAh/9fCSP6NKbATwpOL1+idQVXQokK9GRFURn/jYPGPfegIctwunoA==" }, "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" }, "tsutils": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.10.0.tgz", - "integrity": "sha512-q20XSMq7jutbGB8luhKKsQldRKWvyBO2BGqni3p4yq8Ys9bEP/xQw3KepKmMRt9gJ4lvQSScrihJrcKdKoSU7Q==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.14.0.tgz", + "integrity": "sha512-SmzGbB0l+8I0QwsPgjooFRaRvHLBLNYM8SeQ0k6rtNDru5sCGeLJcZdwilNndN+GysuFjF5EIYgN8GfFG6UeUw==", "requires": { "tslib": "^1.8.1" } @@ -12744,26 +12812,45 @@ "mime-types": "~2.1.24" } }, + "typed-styles": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.5.tgz", + "integrity": "sha512-ht+rEe5UsdEBAa3gr64+QjUOqjOLJfWLvl5HZR5Ev9uo/OnD3p43wPeFSB1hNFc13GXQF/JU1Bn0YHLUqBRIlw==" + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "typescript": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz", + "integrity": "sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==" + }, "ua-parser-js": { - "version": "0.7.17", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", - "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==" + "version": "0.7.20", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.20.tgz", + "integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw==" }, "uglify-js": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.12.tgz", - "integrity": "sha512-KeQesOpPiZNgVwJj8Ge3P4JYbQHUdZzpx6Fahy6eKAYRSV4zhVmLXoC+JtOeYxcHCHTve8RG1ZGdTvpeOUM26Q==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", "optional": true, "requires": { "commander": "~2.20.0", "source-map": "~0.6.1" } }, + "uncontrollable": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-6.2.3.tgz", + "integrity": "sha512-VgOAoBU2ptCL2bfTG2Mra0I8i1u6Aq84AFonD5tmCAYSfs3hWvr2Rlw0q2ntoxXTHjcQOmZOh3FKaN+UZVyREQ==", + "requires": { + "@babel/runtime": "^7.4.5", + "invariant": "^2.2.4" + } + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -12788,64 +12875,15 @@ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==" }, - "unified": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-7.1.0.tgz", - "integrity": "sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw==", - "requires": { - "@types/unist": "^2.0.0", - "@types/vfile": "^3.0.0", - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^1.1.0", - "trough": "^1.0.0", - "vfile": "^3.0.0", - "x-is-string": "^0.1.0" - }, - "dependencies": { - "vfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz", - "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==", - "requires": { - "is-buffer": "^2.0.0", - "replace-ext": "1.0.0", - "unist-util-stringify-position": "^1.0.0", - "vfile-message": "^1.0.0" - } - } - } - }, "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } + "set-value": "^2.0.1" } }, "uniq": { @@ -12867,18 +12905,13 @@ } }, "unique-slug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "requires": { "imurmurhash": "^0.1.4" } }, - "unist-util-stringify-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" - }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -12977,13 +13010,6 @@ "loader-utils": "^1.1.0", "mime": "^2.0.3", "schema-utils": "^1.0.0" - }, - "dependencies": { - "mime": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.3.tgz", - "integrity": "sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw==" - } } }, "url-parse": { @@ -13006,11 +13032,18 @@ "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "requires": { "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } } }, "util-deprecate": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "util.promisify": { @@ -13047,9 +13080,9 @@ } }, "validator": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", - "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-11.1.0.tgz", + "integrity": "sha512-qiQ5ktdO7CD6C/5/mYV4jku/7qnqzjrxb3C/Q5wR3vGGinHTgJZN/TdFT3ZX4vXhX2R1PXx42fB1cn5W+uJ4lg==" }, "value-equal": { "version": "0.4.0", @@ -13076,59 +13109,10 @@ "extsprintf": "^1.2.0" } }, - "vfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.0.0.tgz", - "integrity": "sha512-WMNeHy5djSl895BqE86D7WqA0Ie5fAIeGCa7V1EqiXyJg5LaGch2SUaZueok5abYQGH6mXEAsZ45jkoILIOlyA==", - "requires": { - "@types/unist": "^2.0.2", - "is-buffer": "^2.0.0", - "replace-ext": "1.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - }, - "dependencies": { - "unist-util-stringify-position": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.0.tgz", - "integrity": "sha512-Uz5negUTrf9zm2ZT2Z9kdOL7Mr7FJLyq3ByqagUi7QZRVK1HnspVazvSqwHt73jj7APHtpuJ4K110Jm8O6/elw==", - "requires": { - "@types/unist": "^2.0.2" - } - }, - "vfile-message": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.0.tgz", - "integrity": "sha512-YS6qg6UpBfIeiO+6XlhPOuJaoLvt1Y9g2cmlwqhBOOU0XRV8j5RLeoz72t6PWLvNXq3EBG1fQ05wNPrUoz0deQ==", - "requires": { - "@types/unist": "^2.0.2", - "unist-util-stringify-position": "^1.1.1" - }, - "dependencies": { - "unist-util-stringify-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" - } - } - } - } - }, - "vfile-message": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", - "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", - "requires": { - "unist-util-stringify-position": "^1.1.1" - } - }, "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "requires": { - "indexof": "0.0.1" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==" }, "w3c-hr-time": { "version": "1.0.1", @@ -13182,11 +13166,6 @@ "minimalistic-assert": "^1.0.0" } }, - "web-namespaces": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.3.tgz", - "integrity": "sha512-r8sAtNmgR0WKOKOxzuSgk09JsHlpKlB+uHi937qypOu3PZ17UxPrierFKDye/uNHjNTTEshu5PId8rojIPj/tA==" - }, "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", @@ -13232,13 +13211,6 @@ "mime": "^2.4.2", "range-parser": "^1.2.1", "webpack-log": "^2.0.0" - }, - "dependencies": { - "mime": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.3.tgz", - "integrity": "sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw==" - } } }, "webpack-dev-server": { @@ -13380,11 +13352,12 @@ } }, "websocket-driver": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", - "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", "requires": { - "http-parser-js": ">=0.4.0", + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, @@ -13402,9 +13375,9 @@ } }, "whatwg-fetch": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", - "integrity": "sha512-SA2KdOXATOroD3EBUYvcdugsusXS5YiQFqwskSbsp5b1gK8HpNi/YP0jcy/BDpdllp305HMnrsVf9K7Be9GiEQ==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" }, "whatwg-mimetype": { "version": "2.3.0", @@ -13609,11 +13582,11 @@ } }, "worker-rpc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.0.tgz", - "integrity": "sha1-XxJY3KPWF80YyoZYf4oFrA7r2DQ=", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", + "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", "requires": { - "microevent.ts": "~0.1.0" + "microevent.ts": "~0.1.1" } }, "wrap-ansi": { @@ -13689,20 +13662,15 @@ "async-limiter": "~1.0.0" } }, - "x-is-string": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", - "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=" - }, "xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" }, "xmlchars": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-1.3.1.tgz", - "integrity": "sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.1.1.tgz", + "integrity": "sha512-7hew1RPJ1iIuje/Y01bGD/mXokXxegAgVS+e+E0wSi2ILHQkYAH1+JXARwTjZSM4Z4Z+c73aKspEcqj+zPPL/w==" }, "xregexp": { "version": "4.0.0", @@ -13710,9 +13678,9 @@ "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==" }, "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { "version": "4.0.0", diff --git a/package.json b/package.json index e9295e2..909ec50 100644 --- a/package.json +++ b/package.json @@ -3,47 +3,51 @@ "version": "0.1.0", "private": true, "dependencies": { - "@fortawesome/fontawesome-svg-core": "^1.2.8", - "@fortawesome/free-solid-svg-icons": "^5.5.0", - "@fortawesome/react-fontawesome": "^0.1.3", + "@fortawesome/fontawesome-svg-core": "^1.2.19", + "@fortawesome/free-solid-svg-icons": "^5.9.0", + "@fortawesome/react-fontawesome": "^0.1.4", "babel-runtime": "^6.26.0", - "bootstrap": "^3.3.7", + "bootstrap": "^4.3.1", "classnames": "^2.2.6", - "d3-array": "^1.2.4", + "d3-array": "^2.2.0", "d3-axis": "^1.0.12", - "d3-scale": "^1.0.6", - "d3-selection": "^1.3.2", - "d3-shape": "^1.2.2", + "d3-scale": "^3.0.0", + "d3-scale-chromatic": "^1.3.3", + "d3-selection": "^1.4.0", + "d3-shape": "^1.3.5", "d3-time-format": "^2.1.3", - "es6-promise": "^4.2.5", - "file-saver": "^1.3.8", - "flux": "^3.1.2", - "gaugeJS": "^1.3.2", - "handlebars": "^4.1.1", - "immutable": "^3.8.1", - "jszip": "^3.2.0", + "es6-promise": "^4.2.8", + "file-saver": "^2.0.2", + "flux": "^3.1.3", + "frontend-collective-react-dnd-scrollzone": "^1.0.2", + "gaugeJS": "^1.3.7", + "handlebars": "^4.1.2", + "immutable": "^4.0.0-rc.12", + "jquery": "^3.4.1", + "jszip": "^3.2.2", "libcimsvg": "git+https://git.rwth-aachen.de/acs/public/cim/pintura-npm-package.git", - "lodash": "^4.17.11", - "prop-types": "^15.6.2", - "rc-slider": "^8.6.3", - "react": "^16.6.3", - "react-bootstrap": "^0.31.1", - "react-contexify": "^3.0.3", + "lodash": "^4.17.15", + "prop-types": "^15.7.2", + "rc-slider": "^8.6.13", + "react": "^16.8.6", + "react-bootstrap": "^1.0.0-beta.9", + "react-contexify": "^4.1.1", "react-d3": "^0.4.0", - "react-dnd": "^2.6.0", - "react-dnd-html5-backend": "^2.6.0", - "react-dom": "^16.6.3", - "react-fullscreenable": "^2.5.0", + "react-dnd": "^9.3.2", + "react-dnd-html5-backend": "^9.3.2", + "react-dom": "^16.8.6", + "react-fullscreenable": "^2.5.1-0", "react-json-view": "^1.19.1", "react-notification-system": "^0.2.17", - "react-rnd": "^7.4.3", - "react-router": "^4.3.1", - "react-router-dom": "^4.3.1", + "react-rnd": "^10.0.0", + "react-router": "^5.0.1", + "react-router-dom": "^5.0.1", "react-scripts": "^3.0.1", - "react-sortable-tree": "^0.1.19", - "react-svg-pan-zoom": "^2.18.0", - "superagent": "^3.8.3", - "validator": "^10.9.0" + "react-sortable-tree": "^2.6.2", + "react-svg-pan-zoom": "^3.1.0", + "superagent": "^5.1.0", + "typescript": "^3.5.3", + "validator": "^11.1.0" }, "devDependencies": { "chai": "^4.2.0" diff --git a/packaging/docker/Dockerfile b/packaging/docker/Dockerfile index 33e72b7..28b1443 100644 --- a/packaging/docker/Dockerfile +++ b/packaging/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM node:8.6 AS builder +FROM node:12.2 AS builder RUN apt-get install -y \ git diff --git a/src/components/dialogs/edit-project.js b/src/components/dialogs/edit-project.js index 2b960b6..6f2081d 100644 --- a/src/components/dialogs/edit-project.js +++ b/src/components/dialogs/edit-project.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from './dialog'; @@ -80,12 +80,12 @@ class EditProjectDialog extends React.Component { this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}>
- Name + Name this.handleChange(e)} /> - Simulation + Simulation this.handleChange(e)}> {this.props.simulations.map(simulation => ( diff --git a/src/components/dialogs/edit-simulation.js b/src/components/dialogs/edit-simulation.js index 0b1c87e..a312406 100644 --- a/src/components/dialogs/edit-simulation.js +++ b/src/components/dialogs/edit-simulation.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from './dialog'; import ParametersEditor from '../parameters-editor'; @@ -85,13 +85,13 @@ class EditSimulationDialog extends React.Component { return - Name + Name - Start Parameters + Start Parameters diff --git a/src/components/dialogs/edit-simulator.js b/src/components/dialogs/edit-simulator.js index 346fb2a..de08938 100644 --- a/src/components/dialogs/edit-simulator.js +++ b/src/components/dialogs/edit-simulator.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import _ from 'lodash'; import Dialog from './dialog'; @@ -74,17 +74,17 @@ class EditSimulatorDialog extends React.Component { this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - Name + Name this.handleChange(e)} /> - Endpoint + Endpoint this.handleChange(e)} /> - Properties + Properties diff --git a/src/components/dialogs/edit-user.js b/src/components/dialogs/edit-user.js index e518b7d..d6f1f84 100644 --- a/src/components/dialogs/edit-user.js +++ b/src/components/dialogs/edit-user.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from './dialog'; @@ -82,16 +82,16 @@ class EditUserDialog extends React.Component { this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}>
- Username + Username this.handleChange(e)} /> - E-mail + E-mail this.handleChange(e)} /> - Role + Role this.handleChange(e)}> diff --git a/src/components/dialogs/edit-visualization.js b/src/components/dialogs/edit-visualization.js index ccd8578..565e141 100644 --- a/src/components/dialogs/edit-visualization.js +++ b/src/components/dialogs/edit-visualization.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from './dialog'; @@ -78,7 +78,7 @@ class EditVisualizationDialog extends React.Component { this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - Name + Name this.handleChange(e)} /> diff --git a/src/components/dialogs/edit-widget-aspect-control.js b/src/components/dialogs/edit-widget-aspect-control.js index 2e4d4d8..502e837 100644 --- a/src/components/dialogs/edit-widget-aspect-control.js +++ b/src/components/dialogs/edit-widget-aspect-control.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, Checkbox } from 'react-bootstrap'; +import { FormGroup, FormCheck } from 'react-bootstrap'; class EditWidgetAspectControl extends React.Component { constructor(props) { @@ -40,10 +40,10 @@ class EditWidgetAspectControl extends React.Component { render() { return ( - this.props.handleChange(e)}>Lock Aspect + this.props.handleChange(e)}>Lock Aspect ); } } -export default EditWidgetAspectControl; \ No newline at end of file +export default EditWidgetAspectControl; diff --git a/src/components/dialogs/edit-widget-checkbox-control.js b/src/components/dialogs/edit-widget-checkbox-control.js index 9c063fb..0118abb 100644 --- a/src/components/dialogs/edit-widget-checkbox-control.js +++ b/src/components/dialogs/edit-widget-checkbox-control.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, Checkbox } from 'react-bootstrap'; +import { FormGroup, FormCheck } from 'react-bootstrap'; class EditWidgetCheckboxControl extends React.Component { constructor(props) { @@ -37,9 +37,9 @@ class EditWidgetCheckboxControl extends React.Component { render() { return - this.props.handleChange(e)}>{this.props.text} + this.props.handleChange(e)}>{this.props.text} ; } } -export default EditWidgetCheckboxControl; \ No newline at end of file +export default EditWidgetCheckboxControl; diff --git a/src/components/dialogs/edit-widget-color-control.js b/src/components/dialogs/edit-widget-color-control.js index 6a44e3d..b54b666 100644 --- a/src/components/dialogs/edit-widget-color-control.js +++ b/src/components/dialogs/edit-widget-color-control.js @@ -21,16 +21,18 @@ ******************************************************************************/ import React, { Component } from 'react'; -import { FormGroup, Col, Row, Radio, ControlLabel } from 'react-bootstrap'; +import { FormGroup, Col, Row, FormCheck, FormLabel } from 'react-bootstrap'; import classNames from 'classnames'; -import { scaleOrdinal, schemeCategory20 } from 'd3-scale'; +import { scaleOrdinal } from 'd3-scale'; +import {schemeCategory10} from 'd3-scale-chromatic' +// schemeCategory20 no longer available in d3 class EditWidgetColorControl extends Component { static get ColorPalette() { let colorCount = 0; const colors = []; - const colorScale = scaleOrdinal(schemeCategory20); + const colorScale = scaleOrdinal(schemeCategory10); while (colorCount < 20) { colors.push(colorScale(colorCount)); colorCount++; } colors.unshift('#000', '#FFF'); // include black and white @@ -55,7 +57,7 @@ class EditWidgetColorControl extends Component { return ( - + { this.props.label } @@ -70,7 +72,7 @@ class EditWidgetColorControl extends Component { 'checked': idx === this.state.widget[this.props.controlId] }); - return ( this.props.handleChange({target: { id: this.props.controlId, value: idx}})} />) + return ( this.props.handleChange({target: { id: this.props.controlId, value: idx}})} />) } ) } diff --git a/src/components/dialogs/edit-widget-color-zones-control.js b/src/components/dialogs/edit-widget-color-zones-control.js index 3367218..3fd97d4 100644 --- a/src/components/dialogs/edit-widget-color-zones-control.js +++ b/src/components/dialogs/edit-widget-color-zones-control.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, ControlLabel, Button } from 'react-bootstrap'; +import { FormGroup, FormLabel, Button } from 'react-bootstrap'; import Icon from '../icon'; @@ -115,7 +115,7 @@ class EditWidgetColorZonesControl extends React.Component { render() { return - Color zones + Color zones diff --git a/src/components/dialogs/edit-widget-html-content.js b/src/components/dialogs/edit-widget-html-content.js index 3b02bc3..8633a61 100644 --- a/src/components/dialogs/edit-widget-html-content.js +++ b/src/components/dialogs/edit-widget-html-content.js @@ -20,7 +20,7 @@ **********************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; class EditWidgetHTMLContent extends React.Component { constructor(props) { @@ -43,7 +43,7 @@ class EditWidgetHTMLContent extends React.Component { render() { return - HTML Content + HTML Content this.props.handleChange(e)} /> ; } diff --git a/src/components/dialogs/edit-widget-image-control.js b/src/components/dialogs/edit-widget-image-control.js index 9db27ac..5973a45 100644 --- a/src/components/dialogs/edit-widget-image-control.js +++ b/src/components/dialogs/edit-widget-image-control.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel, Button, ProgressBar } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel, Button, ProgressBar } from 'react-bootstrap'; import AppDispatcher from '../../app-dispatcher'; @@ -72,7 +72,7 @@ class EditImageWidgetControl extends React.Component { render() { return
- Image + Image this.props.handleChange(e)}> {this.props.files.length === 0 ? ( @@ -88,7 +88,7 @@ class EditImageWidgetControl extends React.Component { - Upload + Upload this.setState({ fileList: e.target.files }) } /> diff --git a/src/components/dialogs/edit-widget-min-max-control.js b/src/components/dialogs/edit-widget-min-max-control.js index 39218bf..a09ae77 100644 --- a/src/components/dialogs/edit-widget-min-max-control.js +++ b/src/components/dialogs/edit-widget-min-max-control.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel, Checkbox, Table } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel, FormCheck, Table } from 'react-bootstrap'; class EditWidgetMinMaxControl extends React.Component { constructor(props) { @@ -42,8 +42,8 @@ class EditWidgetMinMaxControl extends React.Component { render() { return - {this.props.label} - this.props.handleChange(e)}>Enable min-max + {this.props.label} + this.props.handleChange(e)}>Enable min-max
diff --git a/src/components/dialogs/edit-widget-number-control.js b/src/components/dialogs/edit-widget-number-control.js index 07de491..378d724 100644 --- a/src/components/dialogs/edit-widget-number-control.js +++ b/src/components/dialogs/edit-widget-number-control.js @@ -20,7 +20,7 @@ **********************************************************************************/ import React, { Component } from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; class EditWidgetNumberControl extends Component { constructor(props) { @@ -39,7 +39,7 @@ class EditWidgetNumberControl extends Component { render() { return ( - {this.props.label} + {this.props.label} this.props.handleChange(e)} /> ); diff --git a/src/components/dialogs/edit-widget-orientation.js b/src/components/dialogs/edit-widget-orientation.js index 737aaef..73f8830 100644 --- a/src/components/dialogs/edit-widget-orientation.js +++ b/src/components/dialogs/edit-widget-orientation.js @@ -20,7 +20,7 @@ **********************************************************************************/ import React, { Component } from 'react'; -import { FormGroup, Col, Row, Radio, ControlLabel } from 'react-bootstrap'; +import { FormGroup, Col, Row, FormCheck, FormLabel } from 'react-bootstrap'; import WidgetSlider from '../widgets/slider'; @@ -48,7 +48,7 @@ class EditWidgetOrientation extends Component { return ( - + Orientation @@ -58,9 +58,9 @@ class EditWidgetOrientation extends Component { let name = WidgetSlider.OrientationTypes[type].name; return ( - this.handleOrientationChange(value)}> + this.handleOrientationChange(value)}> { name } - ) + ) }) } diff --git a/src/components/dialogs/edit-widget-parameters-control.js b/src/components/dialogs/edit-widget-parameters-control.js index 8cf454b..0fd5695 100644 --- a/src/components/dialogs/edit-widget-parameters-control.js +++ b/src/components/dialogs/edit-widget-parameters-control.js @@ -20,7 +20,7 @@ **********************************************************************************/ import React, { Component } from 'react'; -import { FormGroup, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormLabel } from 'react-bootstrap'; import ParametersEditor from '../parameters-editor'; class EditWidgetParametersControl extends Component { @@ -49,7 +49,7 @@ class EditWidgetParametersControl extends Component { render() { return ( - {this.props.label} + {this.props.label} this.handleChange(v)} /> ); diff --git a/src/components/dialogs/edit-widget-signal-control.js b/src/components/dialogs/edit-widget-signal-control.js index 4664936..05f3710 100644 --- a/src/components/dialogs/edit-widget-signal-control.js +++ b/src/components/dialogs/edit-widget-signal-control.js @@ -20,7 +20,7 @@ **********************************************************************************/ import React, { Component } from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; class EditWidgetSignalControl extends Component { constructor(props) { @@ -53,7 +53,7 @@ class EditWidgetSignalControl extends Component { return ( - Signal + Signal this.props.handleChange(e)}> { signalsToRender.length === 0 ? ( diff --git a/src/components/dialogs/edit-widget-signals-control.js b/src/components/dialogs/edit-widget-signals-control.js index 0b55312..045a269 100644 --- a/src/components/dialogs/edit-widget-signals-control.js +++ b/src/components/dialogs/edit-widget-signals-control.js @@ -20,7 +20,7 @@ **********************************************************************************/ import React, { Component } from 'react'; -import { FormGroup, Checkbox, ControlLabel, FormControl } from 'react-bootstrap'; +import { FormGroup, FormCheck, FormLabel, FormControl } from 'react-bootstrap'; class EditWidgetSignalsControl extends Component { constructor(props) { @@ -65,13 +65,13 @@ class EditWidgetSignalsControl extends Component { return ( - Signals + Signals { signalsToRender.length === 0 || !this.state.widget.hasOwnProperty(this.props.controlId)? ( No signals available. ) : ( signalsToRender.map((signal, index) => ( - this.handleSignalChange(e.target.checked, index)}>{signal.name} + this.handleSignalChange(e.target.checked, index)}>{signal.name} )) ) } diff --git a/src/components/dialogs/edit-widget-simulation-control.js b/src/components/dialogs/edit-widget-simulation-control.js index 3ad0642..c9ca495 100644 --- a/src/components/dialogs/edit-widget-simulation-control.js +++ b/src/components/dialogs/edit-widget-simulation-control.js @@ -20,7 +20,7 @@ **********************************************************************************/ import React, { Component } from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; class EditWidgetSimulationControl extends Component { constructor(props) { @@ -41,7 +41,7 @@ class EditWidgetSimulationControl extends Component { render() { return ( - Simulation Model + Simulation Model this.props.handleChange(e)}> { this.props.simulationModels.length === 0 ? ( diff --git a/src/components/dialogs/edit-widget-text-control.js b/src/components/dialogs/edit-widget-text-control.js index d46b98a..bbac6d2 100644 --- a/src/components/dialogs/edit-widget-text-control.js +++ b/src/components/dialogs/edit-widget-text-control.js @@ -20,7 +20,7 @@ **********************************************************************************/ import React, { Component } from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; class EditWidgetTextControl extends Component { constructor(props) { @@ -39,7 +39,7 @@ class EditWidgetTextControl extends Component { render() { return ( - {this.props.label} + {this.props.label} this.props.handleChange(e)} /> diff --git a/src/components/dialogs/edit-widget-text-size-control.js b/src/components/dialogs/edit-widget-text-size-control.js index 0c66ebb..655cdf5 100644 --- a/src/components/dialogs/edit-widget-text-size-control.js +++ b/src/components/dialogs/edit-widget-text-size-control.js @@ -20,7 +20,7 @@ **********************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; class EditWidgetTextSizeControl extends React.Component { render() { @@ -28,7 +28,7 @@ class EditWidgetTextSizeControl extends React.Component { return ( - Text size + Text size this.props.handleChange(e)}> {sizes.map((size, index) => ( @@ -39,4 +39,4 @@ class EditWidgetTextSizeControl extends React.Component { } } -export default EditWidgetTextSizeControl; \ No newline at end of file +export default EditWidgetTextSizeControl; diff --git a/src/components/dialogs/edit-widget-time-control.js b/src/components/dialogs/edit-widget-time-control.js index 8f6434d..cd3d372 100644 --- a/src/components/dialogs/edit-widget-time-control.js +++ b/src/components/dialogs/edit-widget-time-control.js @@ -20,7 +20,7 @@ **********************************************************************************/ import React, { Component } from 'react'; -import { FormGroup, FormControl, ControlLabel, HelpBlock } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel, FormText } from 'react-bootstrap'; class EditWidgetTimeControl extends Component { constructor(props) { @@ -41,9 +41,9 @@ class EditWidgetTimeControl extends Component { return ( - Time + Time this.props.handleChange(e)} /> - Time in seconds + Time in seconds ); } diff --git a/src/components/dialogs/edit-widget.js b/src/components/dialogs/edit-widget.js index 95e20c7..fd5debd 100644 --- a/src/components/dialogs/edit-widget.js +++ b/src/components/dialogs/edit-widget.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -//import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +//import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from './dialog'; diff --git a/src/components/dialogs/import-simulation-model.js b/src/components/dialogs/import-simulation-model.js index 137dfe9..af9a7dc 100644 --- a/src/components/dialogs/import-simulation-model.js +++ b/src/components/dialogs/import-simulation-model.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import _ from 'lodash'; import Dialog from './dialog'; @@ -91,12 +91,12 @@ class ImportSimulationModelDialog extends React.Component { - Simulation Model File + Simulation Model File - Simulator + Simulator {this.props.simulators.map(simulator => ( diff --git a/src/components/dialogs/import-simulation.js b/src/components/dialogs/import-simulation.js index e14eada..1aadb37 100644 --- a/src/components/dialogs/import-simulation.js +++ b/src/components/dialogs/import-simulation.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from './dialog'; import ParametersEditor from '../parameters-editor'; @@ -119,25 +119,25 @@ class ImportSimulationDialog extends React.Component { return - Simulation File + Simulation File - Name + Name this.handleChange(e)} /> - Start Parameters + Start Parameters {/* {this.state.models.map((model, index) => ( - {model.name} - Simulator + {model.name} - Simulator this.handleChange(e, index)}> {this.props.nodes.map(node => ( node.simulators.map((simulator, index) => ( diff --git a/src/components/dialogs/import-simulator.js b/src/components/dialogs/import-simulator.js index 8320572..e884002 100644 --- a/src/components/dialogs/import-simulator.js +++ b/src/components/dialogs/import-simulator.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import _ from 'lodash'; import Dialog from './dialog'; @@ -118,22 +118,22 @@ class ImportSimulatorDialog extends React.Component { this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - Simulator File + Simulator File this.loadFile(e.target.files)} /> - Name + Name this.handleChange(e)} /> - Endpoint + Endpoint this.handleChange(e)} /> - UUID + UUID this.handleChange(e)} /> @@ -143,4 +143,4 @@ class ImportSimulatorDialog extends React.Component { } } -export default ImportSimulatorDialog; \ No newline at end of file +export default ImportSimulatorDialog; diff --git a/src/components/dialogs/import-visualization.js b/src/components/dialogs/import-visualization.js index 5d276f9..22188f2 100644 --- a/src/components/dialogs/import-visualization.js +++ b/src/components/dialogs/import-visualization.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from './dialog'; @@ -118,12 +118,12 @@ class ImportVisualizationDialog extends React.Component { this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - Visualization File + Visualization File this.loadFile(e.target.files)} /> - Name + Name this.handleChange(e)} /> diff --git a/src/components/dialogs/new-project.js b/src/components/dialogs/new-project.js index babcf77..b9a2bbd 100644 --- a/src/components/dialogs/new-project.js +++ b/src/components/dialogs/new-project.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from './dialog'; @@ -82,12 +82,12 @@ class NewProjectDialog extends React.Component { this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - Name + Name this.handleChange(e)} /> - Simulation + Simulation this.handleChange(e)}> {this.props.simulations.map(simulation => ( diff --git a/src/components/dialogs/new-simulation.js b/src/components/dialogs/new-simulation.js index b09559c..3d32e2d 100644 --- a/src/components/dialogs/new-simulation.js +++ b/src/components/dialogs/new-simulation.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from './dialog'; import ParametersEditor from '../parameters-editor'; @@ -81,13 +81,13 @@ class NewSimulationDialog extends React.Component { return - Name + Name - Start Parameters + Start Parameters diff --git a/src/components/dialogs/new-simulator.js b/src/components/dialogs/new-simulator.js index 1eb5b34..ea7335a 100644 --- a/src/components/dialogs/new-simulator.js +++ b/src/components/dialogs/new-simulator.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from './dialog'; @@ -99,17 +99,17 @@ class NewSimulatorDialog extends React.Component { this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - Name + Name this.handleChange(e)} /> - Endpoint + Endpoint this.handleChange(e)} /> - UUID + UUID this.handleChange(e)} /> diff --git a/src/components/dialogs/new-user.js b/src/components/dialogs/new-user.js index f3cf20d..554e14f 100644 --- a/src/components/dialogs/new-user.js +++ b/src/components/dialogs/new-user.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel, HelpBlock } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel, FormText } from 'react-bootstrap'; import Dialog from './dialog'; @@ -84,23 +84,23 @@ class NewUserDialog extends React.Component { this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - Username + Username this.handleChange(e)} /> - Min 3 characters. + Min 3 characters. - E-mail + E-mail this.handleChange(e)} /> - Password + Password this.handleChange(e)} /> - Role + Role this.handleChange(e)}> diff --git a/src/components/dialogs/new-visualization.js b/src/components/dialogs/new-visualization.js index 70b45ec..2427340 100644 --- a/src/components/dialogs/new-visualization.js +++ b/src/components/dialogs/new-visualization.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from './dialog'; @@ -74,7 +74,7 @@ class NewVisualzationDialog extends React.Component { this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - Name + Name this.handleChange(e)} /> diff --git a/src/components/login-form.js b/src/components/login-form.js index 7e09091..e2b48c6 100644 --- a/src/components/login-form.js +++ b/src/components/login-form.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React, { Component } from 'react'; -import { Form, Button, FormGroup, FormControl, ControlLabel, Col } from 'react-bootstrap'; +import { Form, Button, FormGroup, FormControl, FormLabel, Col } from 'react-bootstrap'; import AppDispatcher from '../app-dispatcher'; @@ -63,7 +63,7 @@ class LoginForm extends Component { return ( - + Username @@ -72,7 +72,7 @@ class LoginForm extends Component { - + Password diff --git a/src/components/signal-mapping.js b/src/components/signal-mapping.js index 815d90c..0a66ac5 100644 --- a/src/components/signal-mapping.js +++ b/src/components/signal-mapping.js @@ -21,7 +21,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormGroup, FormControl, ControlLabel, HelpBlock } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel, FormText } from 'react-bootstrap'; import validator from 'validator'; import Table from './table'; @@ -98,14 +98,14 @@ class SignalMapping extends React.Component { render() { return
- {this.props.name} Length + {this.props.name} Length - {this.props.name} Mapping - Click name or type cell to edit + {this.props.name} Mapping + Click name or type cell to edit
diff --git a/src/components/simulator-action.js b/src/components/simulator-action.js index aef6625..765856f 100644 --- a/src/components/simulator-action.js +++ b/src/components/simulator-action.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { Button, DropdownButton, MenuItem } from 'react-bootstrap'; +import { Button, DropdownButton, DropdownItem } from 'react-bootstrap'; class SimulatorAction extends React.Component { constructor(props) { @@ -50,9 +50,9 @@ class SimulatorAction extends React.Component { render() { const actionList = this.props.actions.map(action => ( - + {action.title} - + )); return
diff --git a/src/components/table.js b/src/components/table.js index 0eaac85..ed118a0 100644 --- a/src/components/table.js +++ b/src/components/table.js @@ -21,7 +21,7 @@ import React, { Component } from 'react'; import _ from 'lodash'; -import { Table, Button, FormControl, Label, Checkbox } from 'react-bootstrap'; +import { Table, Button, FormControl, FormLabel, FormCheck } from 'react-bootstrap'; import { Link } from 'react-router-dom'; import Icon from './icon'; @@ -89,7 +89,7 @@ class CustomTable extends Component { labelContent = child.props.labelModifier(labelContent, data); } - cell.push( ); + cell.push( {labelContent.toString()}); } if (child.props.dataIndex) { @@ -108,7 +108,7 @@ class CustomTable extends Component { if (child.props.checkbox) { const checkboxKey = this.props.checkboxKey; - cell.push( child.props.onChecked(index, e)} />); + cell.push( child.props.onChecked(index, e)} />); } if (child.props.exportButton) { diff --git a/src/components/widget-plot/plot-legend.js b/src/components/widget-plot/plot-legend.js index 4bde597..239072c 100644 --- a/src/components/widget-plot/plot-legend.js +++ b/src/components/widget-plot/plot-legend.js @@ -21,7 +21,8 @@ ******************************************************************************/ import React from 'react'; -import { scaleOrdinal, schemeCategory10 } from 'd3-scale'; +import { scaleOrdinal} from 'd3-scale'; +import {schemeCategory10} from 'd3-scale-chromatic' class PlotLegend extends React.Component { render() { diff --git a/src/components/widget-plot/plot.js b/src/components/widget-plot/plot.js index a3f6d37..044598d 100644 --- a/src/components/widget-plot/plot.js +++ b/src/components/widget-plot/plot.js @@ -21,7 +21,8 @@ ******************************************************************************/ import React from 'react'; -import { scaleLinear, scaleTime, scaleOrdinal, schemeCategory10 } from 'd3-scale'; +import { scaleLinear, scaleTime, scaleOrdinal} from 'd3-scale'; +import {schemeCategory10} from 'd3-scale-chromatic' import { extent } from 'd3-array'; import { line } from 'd3-shape'; import { axisBottom, axisLeft } from 'd3-axis'; diff --git a/src/components/widgets/input.js b/src/components/widgets/input.js index 63bc655..7272279 100644 --- a/src/components/widgets/input.js +++ b/src/components/widgets/input.js @@ -21,7 +21,7 @@ ******************************************************************************/ import React, { Component } from 'react'; -import { Form, FormGroup, Col, ControlLabel, FormControl, InputGroup } from 'react-bootstrap'; +import { Form, FormGroup, Col, FormLabel, FormControl, InputGroup } from 'react-bootstrap'; class WidgetInput extends Component { @@ -75,7 +75,7 @@ class WidgetInput extends Component {
-
+ {this.props.widget.name} diff --git a/src/components/widgets/plot-table.js b/src/components/widgets/plot-table.js index 368f7c5..1b6fc80 100644 --- a/src/components/widgets/plot-table.js +++ b/src/components/widgets/plot-table.js @@ -21,7 +21,7 @@ import React, { Component } from 'react'; import classNames from 'classnames'; -import { FormGroup, Checkbox } from 'react-bootstrap'; +import { FormGroup, FormCheck } from 'react-bootstrap'; import Plot from '../widget-plot/plot'; import PlotLegend from '../widget-plot/plot-legend'; @@ -118,7 +118,7 @@ class WidgetPlotTable extends Component { 'btn-default': true, 'active': checked }); - return this.updateSignalSelection(signal.index, e.target.checked) } > { signal.name } + return this.updateSignalSelection(signal.index, e.target.checked) } > { signal.name } }); } diff --git a/src/containers/FluxContainerConverter.js b/src/containers/FluxContainerConverter.js new file mode 100644 index 0000000..bd2196a --- /dev/null +++ b/src/containers/FluxContainerConverter.js @@ -0,0 +1,15 @@ +/// FluxContainerConverter.js +/// This is an ugly workaround found here https://github.com/facebook/flux/issues/351 to make Flux Containers work with ES6 + +module.exports = { + convert: function(containerClass) { + const tmp = containerClass; + containerClass = function(...args) { + return new tmp(...args); + }; + containerClass.prototype = tmp.prototype; + containerClass.getStores = tmp.getStores; + containerClass.calculateState = tmp.calculateState; + return containerClass; + } +}; diff --git a/src/containers/app.js b/src/containers/app.js index 4199935..5474190 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -21,7 +21,7 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { DragDropContext } from 'react-dnd'; +import { DndProvider } from 'react-dnd'; import HTML5Backend from 'react-dnd-html5-backend'; import NotificationSystem from 'react-notification-system'; import { Redirect, Route } from 'react-router-dom'; @@ -51,6 +51,7 @@ import Users from './users'; import '../styles/app.css'; class App extends React.Component { + static getStores() { return [ SimulatorStore, UserStore, SimulationStore ]; } @@ -112,40 +113,44 @@ class App extends React.Component { } return ( -
-
- - + +
+
+ + -
- +
+ -
+
-
-
- - +
+
+ + -
- - - - - - - - - - +
+ + + + + + + + + + +
- -
+
+ - - ); + + ) } } -export default DragDropContext(HTML5Backend)(Container.create(App)); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(App)); +//DragDropContext(HTML5Backend)(Container.create(App)); diff --git a/src/containers/login.js b/src/containers/login.js index 2a812cf..ee613a6 100644 --- a/src/containers/login.js +++ b/src/containers/login.js @@ -21,7 +21,7 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; -import { PageHeader } from 'react-bootstrap'; +import { NavbarBrand } from 'react-bootstrap'; import NotificationSystem from 'react-notification-system'; import { Redirect } from 'react-router-dom'; @@ -82,7 +82,7 @@ class Login extends Component {
- Login + Login
@@ -93,4 +93,5 @@ class Login extends Component { } } -export default Container.create(Login); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Login)); diff --git a/src/containers/project.js b/src/containers/project.js index ce5e3b4..74e2da4 100644 --- a/src/containers/project.js +++ b/src/containers/project.js @@ -231,4 +231,5 @@ class Visualizations extends Component { } } -export default Container.create(Visualizations, {withProps: true}); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Visualizations), {withProps: true}); diff --git a/src/containers/projects.js b/src/containers/projects.js index b94c846..d42bd64 100644 --- a/src/containers/projects.js +++ b/src/containers/projects.js @@ -156,4 +156,5 @@ class Projects extends React.Component { } } -export default Container.create(Projects); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Projects)); diff --git a/src/containers/select-file.js b/src/containers/select-file.js index 755356d..3eb97c1 100644 --- a/src/containers/select-file.js +++ b/src/containers/select-file.js @@ -21,7 +21,7 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { FormGroup, FormControl, ControlLabel, Button, ProgressBar, Col } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel, Button, ProgressBar, Col } from 'react-bootstrap'; import FileStore from '../stores/file-store'; import UserStore from '../stores/user-store'; @@ -118,7 +118,7 @@ class SelectFile extends React.Component { return
-
+ {this.props.name} @@ -148,4 +148,5 @@ class SelectFile extends React.Component { } } -export default Container.create(SelectFile); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(SelectFile)); diff --git a/src/containers/select-simulator.js b/src/containers/select-simulator.js index bcf7719..88f7151 100644 --- a/src/containers/select-simulator.js +++ b/src/containers/select-simulator.js @@ -21,7 +21,7 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { FormGroup, FormControl, ControlLabel, Col } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel, Col } from 'react-bootstrap'; import _ from 'lodash'; import SimulatorStore from '../stores/simulator-store'; @@ -72,7 +72,7 @@ class SelectSimulator extends React.Component { ); return - + Simulator @@ -85,4 +85,5 @@ class SelectSimulator extends React.Component { } } -export default Container.create(SelectSimulator); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(SelectSimulator)); diff --git a/src/containers/simulation-model.js b/src/containers/simulation-model.js index 975b9e6..9ba7390 100644 --- a/src/containers/simulation-model.js +++ b/src/containers/simulation-model.js @@ -21,7 +21,7 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { Button, Col, Form, ControlLabel } from 'react-bootstrap'; +import { Button, Col, Form, FormLabel } from 'react-bootstrap'; import SimulationModelStore from '../stores/simulation-model-store'; import UserStore from '../stores/user-store'; @@ -140,7 +140,7 @@ class SimulationModel extends React.Component {
-
+ Start Parameters @@ -168,4 +168,5 @@ class SimulationModel extends React.Component { } } -export default Container.create(SimulationModel, { withProps: true }); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(SimulationModel), { withProps: true }); diff --git a/src/containers/simulation.js b/src/containers/simulation.js index 090a8de..9f9a0f3 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -285,4 +285,5 @@ class Simulation extends React.Component { } } -export default Container.create(Simulation, { withProps: true }); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Simulation), { withProps: true }); diff --git a/src/containers/simulations.js b/src/containers/simulations.js index 2bd8a1d..5f9429f 100644 --- a/src/containers/simulations.js +++ b/src/containers/simulations.js @@ -325,4 +325,5 @@ class Simulations extends Component { } } -export default Container.create(Simulations); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Simulations)); diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 9e07bab..20fb207 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -310,4 +310,5 @@ class Simulators extends Component { } } -export default Container.create(Simulators); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Simulators)); diff --git a/src/containers/users.js b/src/containers/users.js index 1e1779e..59cb5af 100644 --- a/src/containers/users.js +++ b/src/containers/users.js @@ -139,4 +139,5 @@ class Users extends Component { } } -export default Container.create(Users); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Users)); diff --git a/src/containers/visualization.js b/src/containers/visualization.js index a9e53ff..36fac12 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -547,4 +547,5 @@ class Visualization extends React.Component { } } -export default Fullscreenable()(Container.create(Visualization, { withProps: true })); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Fullscreenable()(Container.create(fluxContainerConverter.convert(Visualization), { withProps: true })); diff --git a/src/containers/widget.js b/src/containers/widget.js index b4df992..3a6a715 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -22,7 +22,7 @@ import React from 'react'; import { Container } from 'flux/utils'; import { ContextMenuProvider } from 'react-contexify'; -import Rnd from 'react-rnd'; +import { Rnd } from 'react-rnd'; import classNames from 'classnames'; import AppDispatcher from '../app-dispatcher'; @@ -294,4 +294,5 @@ class Widget extends React.Component { } } -export default Container.create(Widget, { withProps: true }); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Widget), { withProps: true }); diff --git a/src/data-managers/rest-data-manager.js b/src/data-managers/rest-data-manager.js index dbd278e..321a542 100644 --- a/src/data-managers/rest-data-manager.js +++ b/src/data-managers/rest-data-manager.js @@ -22,7 +22,7 @@ import RestAPI from '../api/rest-api'; import AppDispatcher from '../app-dispatcher'; -const API_URL = '/api/v1'; +const API_URL = '/api/v2'; class RestDataManager { constructor(type, url, keyFilter) { From f72d7b892f22bb2ea49a00ab94c13e4c724feb79 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 22 Jul 2019 16:12:32 +0200 Subject: [PATCH 05/34] comment query of counts endpoint for now --- src/components/home.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/home.js b/src/components/home.js index 86ea56b..b81bab7 100644 --- a/src/components/home.js +++ b/src/components/home.js @@ -41,9 +41,9 @@ class Home extends React.Component { } componentWillMount() { - RestAPI.get('/api/v1/counts').then(response => { - this.setState({ counts: response }); - }); + //RestAPI.get('/api/v1/counts').then(response => { + // this.setState({ counts: response }); + //}); } render() { From 00544c2fe046954d194b175896adfa45ce3f2bea Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 22 Jul 2019 16:13:39 +0200 Subject: [PATCH 06/34] save user information from login response of backend, omit users/me endpoint --- src/data-managers/users-data-manager.js | 29 +++++++++++++------------ src/stores/user-store.js | 13 ++++++----- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/data-managers/users-data-manager.js b/src/data-managers/users-data-manager.js index f5db8f8..07d1b12 100644 --- a/src/data-managers/users-data-manager.js +++ b/src/data-managers/users-data-manager.js @@ -32,7 +32,8 @@ class UsersDataManager extends RestDataManager { RestAPI.post(this.makeURL('/authenticate'), { username: username, password: password }).then(response => { AppDispatcher.dispatch({ type: 'users/logged-in', - token: response.token + token: response.token, + user: response.user }); }).catch(error => { AppDispatcher.dispatch({ @@ -42,19 +43,19 @@ class UsersDataManager extends RestDataManager { }); } - getCurrentUser(token) { - RestAPI.get(this.makeURL('/users/me'), token).then(response => { - AppDispatcher.dispatch({ - type: 'users/current-user', - user: response.user - }); - }).catch(error => { - AppDispatcher.dispatch({ - type: 'users/current-user-error', - error: error - }); - }); - } + //getCurrentUser(token) { + // RestAPI.get(this.makeURL('/users/me'), token).then(response => { + // AppDispatcher.dispatch({ + // type: 'users/current-user', + // user: response.user + // }); + // }).catch(error => { + // AppDispatcher.dispatch({ + // type: 'users/current-user-error', + // error: error + // }); + // }); + //} } diff --git a/src/stores/user-store.js b/src/stores/user-store.js index e8722c8..ecaede5 100644 --- a/src/stores/user-store.js +++ b/src/stores/user-store.js @@ -53,14 +53,15 @@ class UserStore extends ReduceStore { return Object.assign({}, state, { token: null, currentUser: null }); case 'users/logged-in': - // request logged-in user data - UsersDataManager.getCurrentUser(action.token); + // // request logged-in user data + //UsersDataManager.getCurrentUser(action.token); - return Object.assign({}, state, { token: action.token }); + //save token and logged-in user + return Object.assign({}, state, { token: action.token, currentUser: action.user }); - case 'users/current-user': - // save logged-in user - return Object.assign({}, state, { currentUser: action.user }); + //case 'users/current-user': + // // save logged-in user + // return Object.assign({}, state, { currentUser: action.user }); case 'users/current-user-error': // discard user token From 5d97e1f32e71db2d554780431432a2fca6e15240 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 23 Jul 2019 17:16:50 +0200 Subject: [PATCH 07/34] started with adaptions for new package versions and new Go backend API --- package-lock.json | 8 +++++ package.json | 1 + src/api/rest-api.js | 11 +++---- src/components/dialogs/edit-simulator.js | 10 +++---- .../dialogs/import-simulation-model.js | 2 +- src/components/dialogs/new-user.js | 11 +++++-- src/components/header-menu.js | 5 ++-- src/components/header.js | 17 +++++++---- src/components/home.js | 24 +++++++++++---- src/components/login-form.js | 14 ++++----- src/components/menu-sidebar.js | 2 +- src/components/table-column.js | 5 +++- src/components/table.js | 16 ++++++---- src/containers/app.js | 20 +++++++++---- src/containers/login.js | 8 +++-- src/containers/select-simulator.js | 4 +-- src/containers/simulation.js | 4 +-- src/containers/simulators.js | 30 +++++++++++-------- src/containers/users.js | 2 +- src/data-managers/rest-data-manager.js | 4 +-- src/data-managers/simulators-data-manager.js | 2 +- src/data-managers/users-data-manager.js | 29 +++++++++--------- src/stores/array-store.js | 2 +- src/stores/simulator-store.js | 5 ++-- src/stores/user-store.js | 10 +++---- 25 files changed, 154 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8ed2120..dfcc0c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10920,6 +10920,14 @@ "react-display-name": "^0.2.0" } }, + "react-grid-system": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/react-grid-system/-/react-grid-system-4.4.10.tgz", + "integrity": "sha512-ZSmQ+284QOYqDKkb5kbaFUWsuczLMQmlkAYNVv2UorG1z177UxQPYcCwmzKXpuGascksImuLpitpMpnn0UacXg==", + "requires": { + "prop-types": "^15.7.2" + } + }, "react-is": { "version": "16.8.6", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", diff --git a/package.json b/package.json index 909ec50..16782d4 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "react-dnd-html5-backend": "^9.3.2", "react-dom": "^16.8.6", "react-fullscreenable": "^2.5.1-0", + "react-grid-system": "^4.4.10", "react-json-view": "^1.19.1", "react-notification-system": "^0.2.17", "react-rnd": "^10.0.0", diff --git a/src/api/rest-api.js b/src/api/rest-api.js index 43af793..4fb5395 100644 --- a/src/api/rest-api.js +++ b/src/api/rest-api.js @@ -58,7 +58,8 @@ class RestAPI { var req = request.get(url); if (token != null) { - req.set('x-access-token', token); + req.set('Authorization', "Bearer " + token); + } req.end(function (error, res) { @@ -76,7 +77,7 @@ class RestAPI { var req = request.post(url).send(body).timeout({ response: 5000 }); // Simple response start timeout (3s) if (token != null) { - req.set('x-access-token', token); + req.set('Authorization', "Bearer " + token); } req.end(function (error, res) { @@ -97,7 +98,7 @@ class RestAPI { var req = request.delete(url); if (token != null) { - req.set('x-access-token', token); + req.set('Authorization', "Bearer " + token); } req.end(function (error, res) { @@ -115,7 +116,7 @@ class RestAPI { var req = request.put(url).send(body); if (token != null) { - req.set('x-access-token', token); + req.set('Authorization', "Bearer " + token); } req.end(function (error, res) { @@ -133,7 +134,7 @@ class RestAPI { const req = request.post(url).send(data).on('progress', progressCallback); if (token != null) { - req.set('x-access-token', token); + req.set('Authorization', "Bearer " + token); } req.end(function (error, res) { diff --git a/src/components/dialogs/edit-simulator.js b/src/components/dialogs/edit-simulator.js index de08938..74edcd2 100644 --- a/src/components/dialogs/edit-simulator.js +++ b/src/components/dialogs/edit-simulator.js @@ -74,17 +74,17 @@ class EditSimulatorDialog extends React.Component { this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - Name - this.handleChange(e)} /> + Name + this.handleChange(e)} /> - Endpoint - this.handleChange(e)} /> + Endpoint + this.handleChange(e)} /> - Properties + Properties diff --git a/src/components/dialogs/import-simulation-model.js b/src/components/dialogs/import-simulation-model.js index af9a7dc..55e7a2b 100644 --- a/src/components/dialogs/import-simulation-model.js +++ b/src/components/dialogs/import-simulation-model.js @@ -99,7 +99,7 @@ class ImportSimulationModelDialog extends React.Component { Simulator {this.props.simulators.map(simulator => ( - + ))} diff --git a/src/components/dialogs/new-user.js b/src/components/dialogs/new-user.js index 554e14f..a0c1ed0 100644 --- a/src/components/dialogs/new-user.js +++ b/src/components/dialogs/new-user.js @@ -34,7 +34,8 @@ class NewUserDialog extends React.Component { username: '', mail: '', role: 'admin', - password: '' + password: '', + id: 0 }; } @@ -57,7 +58,8 @@ class NewUserDialog extends React.Component { username: '', mail: '', role: 'admin', - password: '' + password: '', + id: 0 }); } @@ -65,8 +67,9 @@ class NewUserDialog extends React.Component { // check all controls let username = this.state.username !== '' && this.state.username.length >= 3; let password = this.state.password !== ''; + let id = this.state.id !== 0; - this.valid = username && password; + this.valid = username && password && id; // return state to control switch(target) { @@ -74,6 +77,8 @@ class NewUserDialog extends React.Component { return username ? "success" : "error"; case 'password': return password ? "success" : "error"; + case 'id': + return id ? "success" : "error"; default: return "success"; } diff --git a/src/components/header-menu.js b/src/components/header-menu.js index b2daf0e..0273407 100644 --- a/src/components/header-menu.js +++ b/src/components/header-menu.js @@ -26,14 +26,15 @@ import { NavLink } from 'react-router-dom'; export default class HeaderMenu extends React.Component { render() { return
- + +
  • Home
  • Projects
  • Simulations
  • Simulators
  • - { this.props.currentRole === 'admin' ? + { this.props.currentRole === 'Admin' ?
  • User Management
  • : '' }
  • Logout
  • diff --git a/src/components/header.js b/src/components/header.js index 710ea9b..7d72e0c 100644 --- a/src/components/header.js +++ b/src/components/header.js @@ -21,20 +21,25 @@ import React from 'react'; import { Col, Button } from 'react-bootstrap'; +import { Hidden } from 'react-grid-system' import Icon from './icon'; class Header extends React.Component { render() { return (
    -
+

VILLASweb

- - {this.props.showMenuButton && - - } - + + + {this.props.showMenuButton && + + } + + ); } diff --git a/src/components/home.js b/src/components/home.js index b81bab7..63863fb 100644 --- a/src/components/home.js +++ b/src/components/home.js @@ -21,16 +21,24 @@ import React from 'react'; -import { Link } from 'react-router-dom'; +//import { Link } from 'react-router-dom'; -import RestAPI from '../api/rest-api'; +//import RestAPI from '../api/rest-api'; import config from '../config'; +import UserStore from "../stores/user-store"; class Home extends React.Component { constructor(props) { super(props); - this.state = {}; + let currentUser = UserStore.getState().currentUser; + + this.state = { + currentRole: currentUser ? currentUser.role : '', + currentUsername: currentUser ? currentUser.username: '', + currentUserID: currentUser ? currentUser.id: 0, + token: UserStore.getState().token + }; } getCounts(type) { @@ -56,15 +64,21 @@ class Home extends React.Component { VILLASweb is a frontend for distributed real-time simulation hosted by {config.admin.name}.

- This instance is hosting {this.getCounts('projects')} projects consisting of {this.getCounts('simulators')} simulators, {this.getCounts('visualizations')} visualizations and {this.getCounts('simulations')} simulations. - A total of {this.getCounts('users')} users are registered.
+ You are logged in as user {this.state.currentUsername} with ID {this.state.currentUserID} and role {this.state.currentRole}.

+ {/* +

+ This instance is hosting {this.getCounts('projects')} projects consisting of {this.getCounts('simulators')} simulators, {this.getCounts('visualizations')} visualizations and {this.getCounts('simulations')} simulations. + A total of {this.getCounts('users')} users are registered.
+

+ */}

Credits

VILLASweb is developed by the Institute for Automation of Complex Power Systems at the RWTH Aachen University.

Links

    diff --git a/src/components/login-form.js b/src/components/login-form.js index e2b48c6..7747723 100644 --- a/src/components/login-form.js +++ b/src/components/login-form.js @@ -61,20 +61,16 @@ class LoginForm extends Component { render() { return ( -
    + -
- Username - + Username this.handleChange(e)} /> - - Password - + Password this.handleChange(e)} /> @@ -82,14 +78,14 @@ class LoginForm extends Component { {this.props.loginMessage &&
-
+ Error: {this.props.loginMessage} } - + diff --git a/src/components/menu-sidebar.js b/src/components/menu-sidebar.js index 51d7d83..8ea2e8d 100644 --- a/src/components/menu-sidebar.js +++ b/src/components/menu-sidebar.js @@ -33,7 +33,7 @@ class SidebarMenu extends React.Component {
  • Projects
  • Simulations
  • Simulators
  • - { this.props.currentRole === 'admin' ? + { this.props.currentRole === 'Admin' ?
  • Users
  • : '' }
  • Logout
  • diff --git a/src/components/table-column.js b/src/components/table-column.js index 1aafc2e..151e3eb 100644 --- a/src/components/table-column.js +++ b/src/components/table-column.js @@ -36,7 +36,10 @@ class TableColumn extends Component { clickable: false, labelKey: null, checkbox: false, - checkboxKey: '' + checkboxKey: '', + labelStyle: null, + labelModifier: null + }; render() { diff --git a/src/components/table.js b/src/components/table.js index ed118a0..8d2d33d 100644 --- a/src/components/table.js +++ b/src/components/table.js @@ -74,7 +74,7 @@ class CustomTable extends Component { if (linkKey && data[linkKey] != null) { cell.push({content}); } else if (child.props.clickable) { - cell.push(); + cell.push(); } else { cell.push(content); } @@ -89,7 +89,13 @@ class CustomTable extends Component { labelContent = child.props.labelModifier(labelContent, data); } - cell.push( {labelContent.toString()}); + cell.push( +   + + {labelContent.toString()} + + + ); } if (child.props.dataIndex) { @@ -98,11 +104,11 @@ class CustomTable extends Component { // add buttons if (child.props.editButton) { - cell.push(); + cell.push(); } if (child.props.deleteButton) { - cell.push(); + cell.push(); } if (child.props.checkbox) { @@ -112,7 +118,7 @@ class CustomTable extends Component { } if (child.props.exportButton) { - cell.push(); + cell.push(); } return cell; diff --git a/src/containers/app.js b/src/containers/app.js index 5474190..763e012 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -26,6 +26,7 @@ import HTML5Backend from 'react-dnd-html5-backend'; import NotificationSystem from 'react-notification-system'; import { Redirect, Route } from 'react-router-dom'; import { Col } from 'react-bootstrap'; +import { Hidden } from 'react-grid-system' import AppDispatcher from '../app-dispatcher'; import SimulationStore from '../stores/simulation-store'; @@ -63,6 +64,8 @@ class App extends React.Component { simulators: SimulatorStore.getState(), simulations: SimulationStore.getState(), currentRole: currentUser ? currentUser.role : '', + currentUsername: currentUser ? currentUser.username: '', + currentUserID: UserStore.getState().userid, token: UserStore.getState().token, showSidebarMenu: false, @@ -72,6 +75,7 @@ class App extends React.Component { componentWillMount() { // if token stored locally, request user const token = localStorage.getItem('token'); + const userid = localStorage.getItem('userid'); if (token != null && token !== '') { // save token so we dont logout @@ -79,7 +83,8 @@ class App extends React.Component { AppDispatcher.dispatch({ type: 'users/logged-in', - token: token + token: token, + userid: userid }); } } @@ -115,17 +120,22 @@ class App extends React.Component { return (
    + {/*
    - - + */} + + + + +
    -
    +
    -
    + diff --git a/src/containers/login.js b/src/containers/login.js index ee613a6..93afa80 100644 --- a/src/containers/login.js +++ b/src/containers/login.js @@ -42,7 +42,8 @@ class Login extends Component { return { currentUser: UserStore.getState().currentUser, token: UserStore.getState().token, - loginMessage: UserStore.getState().loginMessage + loginMessage: UserStore.getState().loginMessage, + userid: UserStore.getState().userid }; } @@ -54,11 +55,13 @@ class Login extends Component { // if token stored locally, request user if (nextState.token == null) { const token = localStorage.getItem('token'); + const userid = localStorage.getItem('userid'); if (token != null && token !== '' && nextState.currentUser == null) { AppDispatcher.dispatch({ type: 'users/logged-in', - token: token + token: token, + userid: userid }); } } else { @@ -66,6 +69,7 @@ class Login extends Component { if (nextState.currentUser != null) { // save login in local storage localStorage.setItem('token', nextState.token); + localStorage.setItem('userid', nextState.userid); } } } diff --git a/src/containers/select-simulator.js b/src/containers/select-simulator.js index 88f7151..4b69ff1 100644 --- a/src/containers/select-simulator.js +++ b/src/containers/select-simulator.js @@ -46,7 +46,7 @@ class SelectSimulator extends React.Component { let selectedSimulator = nextProps.value; if (selectedSimulator == null) { if (this.state.simulators.length > 0) { - selectedSimulator = this.state.simulators[0]._id; + selectedSimulator = this.state.simulators[0].id; } else { selectedSimulator = ''; } @@ -60,7 +60,7 @@ class SelectSimulator extends React.Component { // send complete simulator to callback if (this.props.onChange != null) { - const simulator = this.state.simulators.find(s => s._id === event.target.value); + const simulator = this.state.simulators.find(s => s.id === event.target.value); this.props.onChange(simulator); } diff --git a/src/containers/simulation.js b/src/containers/simulation.js index 9f9a0f3..7a66ea1 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -101,7 +101,7 @@ class Simulation extends React.Component { const simulationModel = { simulation: this.state.simulation._id, name: 'New Simulation Model', - simulator: this.state.simulators.length > 0 ? this.state.simulators[0]._id : null, + simulator: this.state.simulators.length > 0 ? this.state.simulators[0].id : null, outputLength: 1, outputMapping: [{ name: 'Signal', type: 'Type' }], inputLength: 1, @@ -165,7 +165,7 @@ class Simulation extends React.Component { getSimulatorName(simulatorId) { for (let simulator of this.state.simulators) { - if (simulator._id === simulatorId) { + if (simulator.id === simulatorId) { return _.get(simulator, 'properties.name') || _.get(simulator, 'rawProperties.name') || simulator.uuid; } } diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 20fb207..7972dfb 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -66,12 +66,15 @@ class Simulators extends Component { static calculateState() { const simulators = SimulatorStore.getState().sort((a, b) => { - if (a.state !== b.state) - return this.statePrio(a.state) > this.statePrio(b.state); - else if (a.name !== b.name) + if (a.state !== b.state) { + return Simulators.statePrio(a.state) > Simulators.statePrio(b.state); + } + else if (a.name !== b.name) { return a.name < b.name; - else + } + else { return a.stateUpdatedAt < b.stateUpdatedAt; + } }); return { @@ -123,6 +126,9 @@ class Simulators extends Component { if (data) { let simulator = this.state.simulators[this.state.modalIndex]; + console.log("modalIndex: " + this.state.modalIndex); + console.log("Simulator Host:" + simulator.host); + console.log("Simulator at index 1: " + this.state.simulators[1].host) simulator.properties = data; this.setState({ simulator }); @@ -151,7 +157,7 @@ class Simulators extends Component { exportSimulator(index) { // filter properties let simulator = Object.assign({}, this.state.simulators[index]); - delete simulator._id; + delete simulator.id; // show save dialog const blob = new Blob([JSON.stringify(simulator, null, 2)], { type: 'application/json' }); @@ -206,7 +212,7 @@ class Simulators extends Component { } } - isSimulatorOutdated(simulator) { + static isSimulatorOutdated(simulator) { if (!simulator.stateUpdatedAt) return true; @@ -215,10 +221,10 @@ class Simulators extends Component { return Date.now() - new Date(simulator.stateUpdatedAt) > fiveMinutes; } - stateLabelStyle = (state, simulator) => { + static stateLabelStyle(state, simulator){ var style = [ 'label' ]; - if (this.isSimulatorOutdated(simulator) && state !== 'shutdown') { + if (Simulators.isSimulatorOutdated(simulator) && state !== 'shutdown') { style.push('label-outdated'); } @@ -250,7 +256,7 @@ class Simulators extends Component { return style.join(' '); } - stateUpdateModifier = updatedAt => { + static stateUpdateModifier(updatedAt) { const date = new Date(updatedAt); return date.toLocaleString('de-DE'); @@ -268,15 +274,15 @@ class Simulators extends Component {
    this.onSimulatorChecked(index, event)} width='30' /> - + {/* */} - + { + RestAPI.delete(this.makeURL(this.url + '/' + object.id), token).then(response => { AppDispatcher.dispatch({ type: this.type + 's/removed', data: response[this.type], @@ -132,7 +132,7 @@ class RestDataManager { var obj = {}; obj[this.type] = this.filterKeys(object); - RestAPI.put(this.makeURL(this.url + '/' + object._id), obj, token).then(response => { + RestAPI.put(this.makeURL(this.url + '/' + object.id), obj, token).then(response => { AppDispatcher.dispatch({ type: this.type + 's/edited', data: response[this.type] diff --git a/src/data-managers/simulators-data-manager.js b/src/data-managers/simulators-data-manager.js index df45f34..4c34f51 100644 --- a/src/data-managers/simulators-data-manager.js +++ b/src/data-managers/simulators-data-manager.js @@ -30,7 +30,7 @@ class SimulatorsDataManager extends RestDataManager { doActions(simulator, action, token = null) { // TODO: Make only simulator id dependent - RestAPI.post(this.makeURL(this.url + '/' + simulator._id), action, token).then(response => { + RestAPI.post(this.makeURL(this.url + '/' + simulator.id), action, token).then(response => { AppDispatcher.dispatch({ type: 'simulators/action-started', data: response diff --git a/src/data-managers/users-data-manager.js b/src/data-managers/users-data-manager.js index 07d1b12..692b18b 100644 --- a/src/data-managers/users-data-manager.js +++ b/src/data-managers/users-data-manager.js @@ -33,7 +33,8 @@ class UsersDataManager extends RestDataManager { AppDispatcher.dispatch({ type: 'users/logged-in', token: response.token, - user: response.user + user: response.user, + userid: response.user.id }); }).catch(error => { AppDispatcher.dispatch({ @@ -43,19 +44,19 @@ class UsersDataManager extends RestDataManager { }); } - //getCurrentUser(token) { - // RestAPI.get(this.makeURL('/users/me'), token).then(response => { - // AppDispatcher.dispatch({ - // type: 'users/current-user', - // user: response.user - // }); - // }).catch(error => { - // AppDispatcher.dispatch({ - // type: 'users/current-user-error', - // error: error - // }); - // }); - //} + getCurrentUser(token, id) { + RestAPI.get(this.makeURL('/users/' + id), token).then(response => { + AppDispatcher.dispatch({ + type: 'users/current-user', + user: response.user + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: 'users/current-user-error', + error: error + }); + }); + } } diff --git a/src/stores/array-store.js b/src/stores/array-store.js index ccd9689..2d4be7c 100644 --- a/src/stores/array-store.js +++ b/src/stores/array-store.js @@ -39,7 +39,7 @@ class ArrayStore extends ReduceStore { // search for existing element to update state.forEach((element, index, array) => { newElements = newElements.filter((updateElement, newIndex) => { - if (element._id === updateElement._id) { + if (element.id === updateElement.id) { // update each property for (var key in updateElement) { if (updateElement.hasOwnProperty(key)) { diff --git a/src/stores/simulator-store.js b/src/stores/simulator-store.js index 00b8635..03ecf73 100644 --- a/src/stores/simulator-store.js +++ b/src/stores/simulator-store.js @@ -38,7 +38,7 @@ class SimulatorStore extends ArrayStore { const endpoint = _.get(simulator, 'properties.endpoint') || _.get(simulator, 'rawProperties.endpoint'); if (endpoint != null && endpoint !== '') { - SimulatorDataDataManager.open(endpoint, simulator._id); + SimulatorDataDataManager.open(endpoint, simulator.id); } else { // console.warn('Endpoint not found for simulator at ' + endpoint); // console.log(simulator); @@ -53,7 +53,8 @@ class SimulatorStore extends ArrayStore { const endpoint = _.get(simulator, 'properties.endpoint') || _.get(simulator, 'rawProperties.endpoint'); if (endpoint != null && endpoint !== '') { - SimulatorDataDataManager.update(endpoint, simulator._id); + console.log("Updating simulatorid " + simulator.id); + SimulatorDataDataManager.update(endpoint, simulator.id); } return super.reduce(state, action); diff --git a/src/stores/user-store.js b/src/stores/user-store.js index ecaede5..c3c563f 100644 --- a/src/stores/user-store.js +++ b/src/stores/user-store.js @@ -35,6 +35,7 @@ class UserStore extends ReduceStore { users: [], currentUser: null, token: null, + userid: 0, loginMessage: null }; } @@ -54,14 +55,13 @@ class UserStore extends ReduceStore { case 'users/logged-in': // // request logged-in user data - //UsersDataManager.getCurrentUser(action.token); + UsersDataManager.getCurrentUser(action.token, action.userid); - //save token and logged-in user - return Object.assign({}, state, { token: action.token, currentUser: action.user }); + return Object.assign({}, state, { token: action.token, userid: action.userid}); - //case 'users/current-user': + case 'users/current-user': // // save logged-in user - // return Object.assign({}, state, { currentUser: action.user }); + return Object.assign({}, state, { currentUser: action.user}); case 'users/current-user-error': // discard user token From 755784f64c9b20aa602fd4abf37af3fdb2a9c28f Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 24 Jul 2019 10:39:11 +0200 Subject: [PATCH 08/34] fix font weight issue --- src/styles/widgets.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 2e79f89..c52835c 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -231,7 +231,7 @@ li.signal-legend::before { span.signal-unit { color: grey; font-style: italic; - font-weight: 50%; + font-weight: 200; } span.signal-unit::before { From edd7c4f39ddd99885e8b2688d3c4c5628b204254 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 24 Jul 2019 10:42:02 +0200 Subject: [PATCH 09/34] - add session userID as param to dispatcher - fix issue with event handler for deletion of simulator --- src/containers/simulators.js | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 7972dfb..f73e7d3 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -79,6 +79,7 @@ class Simulators extends Component { return { sessionToken: UserStore.getState().token, + sessionUserID: UserStore.getState().userid, simulators, modalSimulator: {}, deleteModal: false, @@ -90,11 +91,12 @@ class Simulators extends Component { componentWillMount() { AppDispatcher.dispatch({ type: 'simulators/start-load', - token: this.state.sessionToken + token: this.state.sessionToken, + userid: this.state.sessionUserID }); // Start timer for periodic refresh - this.timer = window.setInterval(() => this.refresh(), 1000); + this.timer = window.setInterval(() => this.refresh(), 5000); } componentWillUnmount() { @@ -104,7 +106,8 @@ class Simulators extends Component { refresh() { AppDispatcher.dispatch({ type: 'simulators/start-load', - token: this.state.sessionToken + token: this.state.sessionToken, + userid: this.state.sessionUserID }); } @@ -116,7 +119,8 @@ class Simulators extends Component { AppDispatcher.dispatch({ type: 'simulators/start-add', data, - token: this.state.sessionToken + token: this.state.sessionToken, + userid: this.state.sessionUserID }); } } @@ -135,12 +139,13 @@ class Simulators extends Component { AppDispatcher.dispatch({ type: 'simulators/start-edit', data: simulator, - token: this.state.sessionToken + token: this.state.sessionToken, + userid: this.state.sessionUserID }); } } - closeDeleteModal = confirmDelete => { + closeDeleteModal(confirmDelete){ this.setState({ deleteModal: false }); if (confirmDelete === false) { @@ -150,7 +155,8 @@ class Simulators extends Component { AppDispatcher.dispatch({ type: 'simulators/start-remove', data: this.state.modalSimulator, - token: this.state.sessionToken + token: this.state.sessionToken, + userid: this.state.sessionUserID }); } @@ -171,7 +177,8 @@ class Simulators extends Component { AppDispatcher.dispatch({ type: 'simulators/start-add', data, - token: this.state.sessionToken + token: this.state.sessionToken, + userid: this.state.sessionUserID }); } } @@ -207,7 +214,8 @@ class Simulators extends Component { type: 'simulators/start-action', simulator: this.state.simulators[index], data: action.data, - token: this.state.sessionToken + token: this.state.sessionToken, + userid: this.state.sessionUserID }); } } @@ -310,7 +318,7 @@ class Simulators extends Component { this.closeEditModal(data)} simulator={this.state.modalSimulator} /> this.closeImportModal(data)} /> - + this.closeDeleteModal(e)} /> ); } From 9dc65a640b8c40a778581a5ad4dcc4335809d8ac Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 24 Jul 2019 10:58:08 +0200 Subject: [PATCH 10/34] add new funding info on home site --- src/components/home.js | 3 +++ src/img/uel.png | Bin 0 -> 21278 bytes src/img/uel_efre.jpeg | Bin 0 -> 27272 bytes 3 files changed, 3 insertions(+) create mode 100644 src/img/uel.png create mode 100644 src/img/uel_efre.jpeg diff --git a/src/components/home.js b/src/components/home.js index 63863fb..70dedbd 100644 --- a/src/components/home.js +++ b/src/components/home.js @@ -89,11 +89,14 @@ class Home extends React.Component {

    Funding

    The development of VILLASframework projects have received funding from

      +
    • Urban Energy Lab 4.0 a project funded by OP EFRE NRW (European Regional Development Fund) for the setup of a novel energy research infrastructure.
    • RESERVE a European Union’s Horizon 2020 research and innovation programme under grant agreement No 727481
    • JARA-ENERGY. Jülich-Aachen Research Alliance (JARA) is an initiative of RWTH Aachen University and Forschungszentrum Jülich.
    Logo EU Logo EU + Logo UEL OP EFRE NRW + Logo UEL Logo ACS { //Logo JARA diff --git a/src/img/uel.png b/src/img/uel.png new file mode 100644 index 0000000000000000000000000000000000000000..57dc0bded61be5f945d994004c0201a57a1522c8 GIT binary patch literal 21278 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 literal 0 HcmV?d00001 diff --git a/src/img/uel_efre.jpeg b/src/img/uel_efre.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..9887c5499b0a102245b75077df0b79b492357522 GIT binary patch literal 27272 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Ξ|f}5qV2j}b^qk)yqzG4^Yu+nb6~hxSz>Lh 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 Mkip^mW=PCGI+k74+9Sj~y*iG|bW?8=CTc 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 Date: Wed, 24 Jul 2019 16:42:04 +0200 Subject: [PATCH 11/34] some fixes to make simulator add and edit work --- src/components/dialogs/edit-simulator.js | 4 ++-- src/containers/simulators.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/dialogs/edit-simulator.js b/src/components/dialogs/edit-simulator.js index 74edcd2..89ff7e7 100644 --- a/src/components/dialogs/edit-simulator.js +++ b/src/components/dialogs/edit-simulator.js @@ -41,7 +41,7 @@ class EditSimulatorDialog extends React.Component { onClose(canceled) { if (canceled === false) { if (this.valid) { - let data = {}; + let data = this.props.simulator.properties; if (this.state.name != null && this.state.name !== "" && this.state.name !== _.get(this.props.simulator, 'rawProperties.name')) { data.name = this.state.name; @@ -85,7 +85,7 @@ class EditSimulatorDialog extends React.Component { Properties - + diff --git a/src/containers/simulators.js b/src/containers/simulators.js index f73e7d3..aae637f 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -96,7 +96,7 @@ class Simulators extends Component { }); // Start timer for periodic refresh - this.timer = window.setInterval(() => this.refresh(), 5000); + this.timer = window.setInterval(() => this.refresh(), 10000); } componentWillUnmount() { From d4c1f3cbcc7167693bc210c8c6541e5fb6402215 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 24 Jul 2019 16:54:42 +0200 Subject: [PATCH 12/34] fix for bsStyle error in delete dialog --- src/components/dialogs/delete-dialog.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/dialogs/delete-dialog.js b/src/components/dialogs/delete-dialog.js index 13ece5e..c69ad7c 100644 --- a/src/components/dialogs/delete-dialog.js +++ b/src/components/dialogs/delete-dialog.js @@ -43,7 +43,7 @@ class DeleteDialog extends React.Component { - + ; } From 3f03dc98e4074377379a513e62cb55d6bb4c8d25 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 24 Jul 2019 17:03:02 +0200 Subject: [PATCH 13/34] refresh only if no edit or delete dialog is open --- src/containers/simulators.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/containers/simulators.js b/src/containers/simulators.js index aae637f..c44567f 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -96,7 +96,7 @@ class Simulators extends Component { }); // Start timer for periodic refresh - this.timer = window.setInterval(() => this.refresh(), 10000); + this.timer = window.setInterval(() => this.refresh(), 1000); } componentWillUnmount() { @@ -104,11 +104,17 @@ class Simulators extends Component { } refresh() { - AppDispatcher.dispatch({ - type: 'simulators/start-load', - token: this.state.sessionToken, - userid: this.state.sessionUserID - }); + + if (this.state.editModal || this.state.deleteModal){ + // do nothing since a dialog is open at the moment + } + else { + AppDispatcher.dispatch({ + type: 'simulators/start-load', + token: this.state.sessionToken, + userid: this.state.sessionUserID + }); + } } From 2a04039e2afddc49965e40990d0894c36cc6b9ee Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 19 Aug 2019 15:26:13 +0200 Subject: [PATCH 14/34] add column for user ID in list of users --- src/containers/users.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/containers/users.js b/src/containers/users.js index ecb9364..d081bb4 100644 --- a/src/containers/users.js +++ b/src/containers/users.js @@ -123,6 +123,7 @@ class Users extends Component {
    + this.getHumanRoleName(role)} /> this.setState({ editModal: true, modalData: this.state.users[index] })} onDelete={index => this.setState({ deleteModal: true, modalData: this.state.users[index] })} /> From 2ecd1890d9ea0ffa65d9e1c42e18bca4f5135dc9 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 19 Aug 2019 15:28:02 +0200 Subject: [PATCH 15/34] revise form for adding a new user - some modifications required due to React update - merge form validation with handling changes - role of new user defaults to User instead of Admin --- src/components/dialogs/new-user.js | 54 +++++++++++------------------- 1 file changed, 20 insertions(+), 34 deletions(-) diff --git a/src/components/dialogs/new-user.js b/src/components/dialogs/new-user.js index a0c1ed0..e711596 100644 --- a/src/components/dialogs/new-user.js +++ b/src/components/dialogs/new-user.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, FormLabel, FormText } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel, FormText, Col } from 'react-bootstrap'; import Dialog from './dialog'; @@ -33,9 +33,8 @@ class NewUserDialog extends React.Component { this.state = { username: '', mail: '', - role: 'admin', + role: 'User', password: '', - id: 0 }; } @@ -51,65 +50,52 @@ class NewUserDialog extends React.Component { handleChange(e) { this.setState({ [e.target.id]: e.target.value }); + + // check all controls + let username = this.state.username !== '' && this.state.username.length >= 3; + let password = this.state.password !== ''; + let role = this.state.role !== ''; + let mail = this.state.mail !== ''; + + this.valid = username && password && role && mail; + } resetState() { this.setState({ username: '', mail: '', - role: 'admin', + role: 'User', password: '', - id: 0 }); } - validateForm(target) { - // check all controls - let username = this.state.username !== '' && this.state.username.length >= 3; - let password = this.state.password !== ''; - let id = this.state.id !== 0; - - this.valid = username && password && id; - - // return state to control - switch(target) { - case 'username': - return username ? "success" : "error"; - case 'password': - return password ? "success" : "error"; - case 'id': - return id ? "success" : "error"; - default: - return "success"; - } - } - render() { return ( this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}>
    - + Username this.handleChange(e)} /> Min 3 characters. - + E-mail this.handleChange(e)} /> - + Password this.handleChange(e)} /> - + Role - this.handleChange(e)}> - - - + this.handleChange(e)}> + + + From 7cf629517b2e261c2886767e78dde4f584c80ca6 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 19 Aug 2019 16:05:43 +0200 Subject: [PATCH 16/34] rename Users side bar element to User Management --- src/components/menu-sidebar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/menu-sidebar.js b/src/components/menu-sidebar.js index 8ea2e8d..000cdf7 100644 --- a/src/components/menu-sidebar.js +++ b/src/components/menu-sidebar.js @@ -34,7 +34,7 @@ class SidebarMenu extends React.Component {
  • Simulations
  • Simulators
  • { this.props.currentRole === 'Admin' ? -
  • Users
  • : '' +
  • User Management
  • : '' }
  • Logout
  • From 26bc566e36a58649d7d79e25715ff333a332d1d0 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 19 Aug 2019 16:07:21 +0200 Subject: [PATCH 17/34] - some changes due to React update - make edit user dialog work with new backend - form validation moved to handle changes method - Admins can change any user's password --- src/components/dialogs/edit-user.js | 63 ++++++++++++++++++----------- 1 file changed, 39 insertions(+), 24 deletions(-) diff --git a/src/components/dialogs/edit-user.js b/src/components/dialogs/edit-user.js index d6f1f84..0d901bd 100644 --- a/src/components/dialogs/edit-user.js +++ b/src/components/dialogs/edit-user.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; +import {FormGroup, FormControl, FormLabel, Col} from 'react-bootstrap'; import Dialog from './dialog'; @@ -34,7 +34,8 @@ class EditUserDialog extends React.Component { username: '', mail: '', role: '', - _id: '' + id: '', + password: '' } } @@ -50,52 +51,66 @@ class EditUserDialog extends React.Component { handleChange(e) { this.setState({ [e.target.id]: e.target.value }); - } - resetState() { - this.setState({ - username: this.props.user.username, - mail: this.props.user.mail, - role: this.props.user.role, - _id: this.props.user._id - }); - } - - validateForm(target) { // check all controls var username = true; + var role = true; + var mail = true; + var pw = true if (this.state.username === '') { username = false; } - this.valid = username; + if (this.state.role === ''){ + role = false; + } - // return state to control - if (target === 'username') return username ? "success" : "error"; + if(this.state.mail === ''){ + mail = false; + } - return "success"; + if(this.state.password === ''){ + pw = false; + } + + // form is valid if any of the fields contain somethig + this.valid = username || role || mail || pw; + + } + + resetState() { + this.setState({ + //username: this.props.user.username, + //mail: this.props.user.mail, + role: this.props.user.role, + id: this.props.user.id + }); } render() { return ( this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}>
    - + Username this.handleChange(e)} /> - + E-mail this.handleChange(e)} /> - + + Password + this.handleChange(e)} /> + + Role - this.handleChange(e)}> - - - + this.handleChange(e)}> + + + From 982e56614f895dba39eec757a6bd187f8822407f Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 19 Aug 2019 16:09:30 +0200 Subject: [PATCH 18/34] fix for delete dialog of users --- src/containers/users.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/containers/users.js b/src/containers/users.js index d081bb4..b61e16c 100644 --- a/src/containers/users.js +++ b/src/containers/users.js @@ -75,7 +75,7 @@ class Users extends Component { } } - closeDeleteModal = confirmDelete => { + closeDeleteModal(confirmDelete) { this.setState({ deleteModal: false }); if (confirmDelete === false) { @@ -134,7 +134,7 @@ class Users extends Component { this.closeNewModal(data)} /> this.closeEditModal(data)} user={this.state.modalData} /> - + this.closeDeleteModal(e)} /> ); } From 78a604af2ec560b0349212314fa306a3fedbcf76 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 20 Aug 2019 11:47:23 +0200 Subject: [PATCH 19/34] started creation of scenario element to replace simulation and project, WIP --- src/components/dialogs/edit-scenario.js | 99 ++++++ src/components/dialogs/import-scenario.js | 151 +++++++++ src/components/dialogs/new-scenario.js | 95 ++++++ src/components/menu-sidebar.js | 6 +- src/containers/app.js | 32 +- src/containers/scenario.js | 297 ++++++++++++++++++ src/containers/scenarios.js | 328 ++++++++++++++++++++ src/containers/simulation-model.js | 12 +- src/data-managers/scenarios-data-manager.js | 60 ++++ src/stores/scenario-store.js | 63 ++++ 10 files changed, 1122 insertions(+), 21 deletions(-) create mode 100644 src/components/dialogs/edit-scenario.js create mode 100644 src/components/dialogs/import-scenario.js create mode 100644 src/components/dialogs/new-scenario.js create mode 100644 src/containers/scenario.js create mode 100644 src/containers/scenarios.js create mode 100644 src/data-managers/scenarios-data-manager.js create mode 100644 src/stores/scenario-store.js diff --git a/src/components/dialogs/edit-scenario.js b/src/components/dialogs/edit-scenario.js new file mode 100644 index 0000000..0ce5dd6 --- /dev/null +++ b/src/components/dialogs/edit-scenario.js @@ -0,0 +1,99 @@ +/** + * File: edit-scenario.js + * Author: Sonja Happ + * Date: 20.08.2019 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import {FormGroup, FormControl, FormLabel, Col} from 'react-bootstrap'; + +import Dialog from './dialog'; +import ParametersEditor from '../parameters-editor'; + +class EditScenarioDialog extends React.Component { + valid = true; + + constructor(props) { + super(props); + + this.state = { + name: '', + id: '', + startParameters: {} + }; + } + + onClose = canceled => { + if (canceled) { + if (this.props.onClose != null) { + this.props.onClose(); + } + + return; + } + + if (this.valid && this.props.onClose != null) { + this.props.onClose(this.state); + } + }; + + handleChange = event => { + this.setState({ [event.target.id]: event.target.value }); + + let name = true; + + if (this.state.name === '') { + name = false; + } + + this.valid = name; + + }; + + resetState = () => { + this.setState({ + name: this.props.scenario.name, + id: this.props.scenario.id, + startParameters: this.props.scenario.startParameters || {} + }); + } + + handleStartParametersChange = startParameters => { + this.setState({ startParameters }); + } + + render() { + return +
    + + Name + + + + + + Start Parameters + + + + +
    ; + } +} + +export default EditScenarioDialog; diff --git a/src/components/dialogs/import-scenario.js b/src/components/dialogs/import-scenario.js new file mode 100644 index 0000000..bab9f46 --- /dev/null +++ b/src/components/dialogs/import-scenario.js @@ -0,0 +1,151 @@ +/** + * File: import-scenario.js + * Author: Sonja Happ + * Date: 20.08.2019 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import {FormGroup, FormControl, FormLabel, Col} from 'react-bootstrap'; + +import Dialog from './dialog'; +import ParametersEditor from '../parameters-editor'; + +class ImportScenarioDialog extends React.Component { + valid = false; + imported = false; + + constructor(props) { + super(props); + + this.state = { + name: '', + running: '', + simulationModels: [], + startParameters: {} + }; + } + + onClose = canceled => { + if (canceled) { + if (this.props.onClose != null) { + this.props.onClose(); + } + + return; + } + + if (this.valid && this.props.onClose != null) { + this.props.onClose(this.state); + } + } + + handleChange(e, index) { + if (e.target.id === 'simulator') { + const models = this.state.models; + models[index].simulator = JSON.parse(e.target.value); + + this.setState({ models }); + + return; + } + + this.setState({ [e.target.id]: e.target.value }); + + // check all controls + let name = true; + + if (this.state.name === '') { + name = false; + } + + this.valid = name; + } + + resetState = () => { + this.setState({ name: '', models: [], startParameters: {} }); + + this.imported = false; + } + + loadFile = event => { + const file = event.target.files[0]; + + if (!file.type.match('application/json')) { + return; + } + + // create file reader + const reader = new FileReader(); + const self = this; + + reader.onload = onloadEvent => { + const scenario = JSON.parse(onloadEvent.target.result); + + // scenario.simulationModels.forEach(model => { + // model.simulator = { + // node: self.props.nodes[0]._id, + // simulator: 0 + // }; + // }); + + self.imported = true; + self.valid = true; + self.setState({ name: scenario.name, models: scenario.simulationModels, startParameters: scenario.startParameters, running: scenario.running }); + }; + + reader.readAsText(file); + } + + render() { + return +
    + + Scenario File + + + + + Name + this.handleChange(e)} /> + + + + + Start Parameters + + + + + {/* {this.state.models.map((model, index) => ( + + {model.name} - Simulator + this.handleChange(e, index)}> + {this.props.nodes.map(node => ( + node.simulators.map((simulator, index) => ( + + )) + ))} + + + ))} */} + +
    ; + } +} + +export default ImportScenarioDialog; diff --git a/src/components/dialogs/new-scenario.js b/src/components/dialogs/new-scenario.js new file mode 100644 index 0000000..ff8dc68 --- /dev/null +++ b/src/components/dialogs/new-scenario.js @@ -0,0 +1,95 @@ +/** + * File: new-scenario.js + * Author: Sonja Happ + * Date: 20.08.2019 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import {FormGroup, FormControl, FormLabel, Col} from 'react-bootstrap'; + +import Dialog from './dialog'; +import ParametersEditor from '../parameters-editor'; + +class NewScenarioDialog extends React.Component { + valid = false; + + constructor(props) { + super(props); + + this.state = { + name: '', + startParameters: {}, + running: false + }; + } + + onClose = canceled => { + if (canceled) { + if (this.props.onClose != null) { + this.props.onClose(); + } + + return; + } + + if (this.valid && this.props.onClose != null) { + this.props.onClose(this.state); + } + } + + handleChange = event => { + this.setState({ [event.target.id]: event.target.value }); + + // check all controls + let name = true; + + if (this.state.name === '') { + name = false; + } + + this.valid = name; + } + + resetState = () => { + this.setState({ name: '', startParameters: {} }); + } + + handleStartParametersChange = startParameters => { + this.setState({ startParameters }); + } + + render() { + return +
    + + Name + + + + + + Start Parameters + + + + +
    ; + } +} + +export default NewScenarioDialog; diff --git a/src/components/menu-sidebar.js b/src/components/menu-sidebar.js index 000cdf7..70a633a 100644 --- a/src/components/menu-sidebar.js +++ b/src/components/menu-sidebar.js @@ -22,6 +22,9 @@ import React from 'react'; import { NavLink } from 'react-router-dom'; +//
  • Simulations
  • +//
  • Projects
  • + class SidebarMenu extends React.Component { render() { return ( @@ -30,8 +33,7 @@ class SidebarMenu extends React.Component {
    • Home
    • -
    • Projects
    • -
    • Simulations
    • +
    • Scenarios
    • Simulators
    • { this.props.currentRole === 'Admin' ?
    • User Management
    • : '' diff --git a/src/containers/app.js b/src/containers/app.js index 763e012..93c860e 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -29,7 +29,7 @@ import { Col } from 'react-bootstrap'; import { Hidden } from 'react-grid-system' import AppDispatcher from '../app-dispatcher'; -import SimulationStore from '../stores/simulation-store'; +import ScenarioStore from '../stores/scenario-store'; import SimulatorStore from '../stores/simulator-store'; import UserStore from '../stores/user-store'; import NotificationsDataManager from '../data-managers/notifications-data-manager'; @@ -40,12 +40,14 @@ import Footer from '../components/footer'; import SidebarMenu from '../components/menu-sidebar'; import HeaderMenu from '../components/header-menu'; -import Projects from './projects'; -import Project from './project'; +//import Projects from './projects'; +//import Project from './project'; import Simulators from './simulators'; import Visualization from './visualization'; -import Simulations from './simulations'; -import Simulation from './simulation'; +//import Simulations from './simulations'; +//import Simulation from './simulation'; +import Scenarios from './scenarios' +import Scenario from './scenario' import SimulationModel from './simulation-model'; import Users from './users'; @@ -54,7 +56,7 @@ import '../styles/app.css'; class App extends React.Component { static getStores() { - return [ SimulatorStore, UserStore, SimulationStore ]; + return [ SimulatorStore, UserStore, ScenarioStore]; } static calculateState(prevState) { @@ -62,7 +64,7 @@ class App extends React.Component { return { simulators: SimulatorStore.getState(), - simulations: SimulationStore.getState(), + scenarios: ScenarioStore.getState(), currentRole: currentUser ? currentUser.role : '', currentUsername: currentUser ? currentUser.username: '', currentUserID: UserStore.getState().userid, @@ -90,14 +92,14 @@ class App extends React.Component { } componentDidMount() { - // load all simulators and simulations to fetch simulation data + // load all simulators and scenarios to fetch data AppDispatcher.dispatch({ type: 'simulators/start-load', token: this.state.token }); AppDispatcher.dispatch({ - type: 'simulations/start-load', + type: 'scenarios/start-load', token: this.state.token }); @@ -142,11 +144,9 @@ class App extends React.Component {
      - - - - + + @@ -161,6 +161,12 @@ class App extends React.Component { } } +// Removed routes +// +// +// +// + let fluxContainerConverter = require('./FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(App)); //DragDropContext(HTML5Backend)(Container.create(App)); diff --git a/src/containers/scenario.js b/src/containers/scenario.js new file mode 100644 index 0000000..ae03741 --- /dev/null +++ b/src/containers/scenario.js @@ -0,0 +1,297 @@ +/** + * File: scenario.js + * Author: Sonja Happ + * Date: 20.08.2019 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import { Container } from 'flux/utils'; +import { Button } from 'react-bootstrap'; +import FileSaver from 'file-saver'; +import _ from 'lodash'; + +import ScenarioStore from '../stores/scenario-store'; +import SimulatorStore from '../stores/simulator-store'; +import SimulationModelStore from '../stores/simulation-model-store'; +import UserStore from '../stores/user-store'; +import AppDispatcher from '../app-dispatcher'; + +import Icon from '../components/icon'; +import Table from '../components/table'; +import TableColumn from '../components/table-column'; +import ImportSimulationModelDialog from '../components/dialogs/import-simulation-model'; + +import SimulatorAction from '../components/simulator-action'; +import DeleteDialog from '../components/dialogs/delete-dialog'; + +class Scenario extends React.Component { + static getStores() { + return [ ScenarioStore, SimulatorStore, SimulationModelStore, UserStore ]; + } + + static calculateState(prevState, props) { + // get selected scenario + const sessionToken = UserStore.getState().token; + + let scenario = ScenarioStore.getState().find(s => s.id === props.match.params.scenario); + if (scenario == null) { + AppDispatcher.dispatch({ + type: 'scenarios/start-load', + data: props.match.params.scenario, + token: sessionToken + }); + + scenario = {}; + } + + // load models + let simulationModels = []; + if (scenario.simulationModels != null) { + simulationModels = SimulationModelStore.getState().filter(m => m != null && scenario.simulationModels.includes(m.id)); + } + + return { + simulationModels, + scenario, + + //simulators: SimulatorStore.getState(), + sessionToken, + + deleteModal: false, + importModal: false, + modalData: {}, + + selectedSimulationModels: [] + } + } + + componentWillMount() { + AppDispatcher.dispatch({ + type: 'scenarios/start-load', + token: this.state.sessionToken + }); + + AppDispatcher.dispatch({ + type: 'simulationModels/start-load', + token: this.state.sessionToken + }); + + AppDispatcher.dispatch({ + type: 'simulators/start-load', + token: this.state.sessionToken + }); + + //TODO users + + //TODO dashboards + + + + + } + + addSimulationModel = () => { + const simulationModel = { + scenario: this.state.scenario.id, + name: 'New Simulation Model', + simulator: this.state.simulators.length > 0 ? this.state.simulators[0].id : null, + outputLength: 1, + outputMapping: [{ name: 'Signal', type: 'Type' }], + inputLength: 1, + inputMapping: [{ name: 'Signal', type: 'Type' }] + }; + + AppDispatcher.dispatch({ + type: 'simulationModels/start-add', + data: simulationModel, + token: this.state.sessionToken + }); + + this.setState({ scenario: {} }, () => { + AppDispatcher.dispatch({ + type: 'scenarios/start-load', + data: this.props.match.params.scenario, + token: this.state.sessionToken + }); + }); + } + + closeDeleteModal = confirmDelete => { + this.setState({ deleteModal: false }); + + if (confirmDelete === false) { + return; + } + + AppDispatcher.dispatch({ + type: 'simulationModels/start-remove', + data: this.state.modalData, + token: this.state.sessionToken + }); + } + + importSimulationModel = simulationModel => { + this.setState({ importModal: false }); + + if (simulationModel == null) { + return; + } + + simulationModel.scenario = this.state.scenario.id; + + console.log(simulationModel); + + AppDispatcher.dispatch({ + type: 'simulationModels/start-add', + data: simulationModel, + token: this.state.sessionToken + }); + + this.setState({ scenario: {} }, () => { + AppDispatcher.dispatch({ + type: 'scenarios/start-load', + data: this.props.match.params.scenario, + token: this.state.sessionToken + }); + }); + } + + getSimulatorName(simulatorId) { + for (let simulator of this.state.simulators) { + if (simulator.id === simulatorId) { + return _.get(simulator, 'properties.name') || _.get(simulator, 'rawProperties.name') || simulator.uuid; + } + } + } + + exportModel(index) { + // filter properties + const model = Object.assign({}, this.state.simulationModels[index]); + + delete model.simulator; + delete model.scenario; + + // show save dialog + const blob = new Blob([JSON.stringify(model, null, 2)], { type: 'application/json' }); + FileSaver.saveAs(blob, 'simulation model - ' + model.name + '.json'); + } + + onSimulationModelChecked(index, event) { + const selectedSimulationModels = Object.assign([], this.state.selectedSimulationModels); + for (let key in selectedSimulationModels) { + if (selectedSimulationModels[key] === index) { + // update existing entry + if (event.target.checked) { + return; + } + + selectedSimulationModels.splice(key, 1); + + this.setState({ selectedSimulationModels }); + return; + } + } + + // add new entry + if (event.target.checked === false) { + return; + } + + selectedSimulationModels.push(index); + this.setState({ selectedSimulationModels }); + } + + runAction = action => { + for (let index of this.state.selectedSimulationModels) { + // get simulator for model + let simulator = null; + for (let sim of this.state.simulators) { + if (sim._id === this.state.simulationModels[index].simulator) { + simulator = sim; + } + } + + if (simulator == null) { + continue; + } + + if (action.data.action === 'start') { + action.data.parameters = this.state.simulationModels[index].startParameters; + } + + AppDispatcher.dispatch({ + type: 'simulators/start-action', + simulator, + data: action.data, + token: this.state.sessionToken + }); + } + } + + render() { + const buttonStyle = { + marginLeft: '10px' + }; + + return
      +

      {this.state.simulation.name}

      + +
    + this.onSimulationModelChecked(index, event)} width='30' /> + + this.getSimulatorName(simulator)} /> + + + this.setState({ deleteModal: true, modalData: this.state.simulationModels[index], modalIndex: index })} + onExport={index => this.exportModel(index)} + /> +
    + +
    + +
    + +
    + + +
    + +
    + + + + +
    ; + } +} + +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Scenario), { withProps: true }); diff --git a/src/containers/scenarios.js b/src/containers/scenarios.js new file mode 100644 index 0000000..72b63ee --- /dev/null +++ b/src/containers/scenarios.js @@ -0,0 +1,328 @@ +/** + * File: scenarios.js + * Author: Sonja Happ + * Date: 20.08.2019 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React, { Component } from 'react'; +import { Container } from 'flux/utils'; +import { Button } from 'react-bootstrap'; +import FileSaver from 'file-saver'; + +import AppDispatcher from '../app-dispatcher'; +import ScenarioStore from '../stores/scenario-store'; +import UserStore from '../stores/user-store'; +import SimulatorStore from '../stores/simulator-store'; +import SimulationModelStore from '../stores/simulation-model-store'; + +import Icon from '../components/icon'; +import Table from '../components/table'; +import TableColumn from '../components/table-column'; +import NewScenarioDialog from '../components/dialogs/new-scenario'; +import EditScenarioDialog from '../components/dialogs/edit-scenario'; +import ImportScenarioDialog from '../components/dialogs/import-scenario'; + +import SimulatorAction from '../components/simulator-action'; +import DeleteDialog from '../components/dialogs/delete-dialog'; + +class Scenarios extends Component { + static getStores() { + return [ ScenarioStore, UserStore, SimulatorStore, SimulationModelStore ]; + } + + static calculateState() { + const scenarios = ScenarioStore.getState(); + const simulationModels = SimulationModelStore.getState(); + const simulators = SimulatorStore.getState(); + + const sessionToken = UserStore.getState().token; + + return { + scenarios, + simulationModels, + simulators, + sessionToken, + + newModal: false, + deleteModal: false, + editModal: false, + importModal: false, + modalScenario: {}, + + selectedScenarios: [] + }; + } + + componentDidMount() { + AppDispatcher.dispatch({ + type: 'scenarios/start-load', + token: this.state.sessionToken + }); + } + + componentDidUpdate() { + const simulationModelIds = []; + const simulatorIds = []; + + for (let scenario of this.state.scenarios) { + for (let modelId of scenario.simulationModels) { + const model = this.state.simulationModels.find(m => m != null && m.id === modelId); + + if (model == null) { + simulationModelIds.push(modelId); + + continue; + } + + if (this.state.simulators.includes(s => s._id === model.simulator) === false) { + simulatorIds.push(model.simulator); + } + } + } + + if (simulationModelIds.length > 0) { + AppDispatcher.dispatch({ + type: 'simulationModels/start-load', + data: simulationModelIds, + token: this.state.sessionToken + }); + } + + if (simulatorIds.length > 0) { + AppDispatcher.dispatch({ + type: 'simulators/start-load', + data: simulatorIds, + token: this.state.sessionToken + }); + } + } + + closeNewModal(data) { + this.setState({ newModal : false }); + + if (data) { + AppDispatcher.dispatch({ + type: 'scenarios/start-add', + data, + token: this.state.sessionToken + }); + } + } + + showDeleteModal(id) { + // get scenario by id + var deleteScenario; + + this.state.scenarios.forEach((scenario) => { + if (scenario.id === id) { + deleteScenario = scenario; + } + }); + + this.setState({ deleteModal: true, modalScenario: deleteScenario }); + } + + closeDeleteModal = confirmDelete => { + this.setState({ deleteModal: false }); + + if (confirmDelete === false) { + return; + } + + AppDispatcher.dispatch({ + type: 'scenarios/start-remove', + data: this.state.modalScenario, + token: this.state.sessionToken + }); + } + + showEditModal(id) { + // get scenario by id + var editScenario; + + this.state.scenarios.forEach((scenario) => { + if (scenario.id === id) { + editScenario = scenario; + } + }); + + this.setState({ editModal: true, modalScenario: editScenario }); + } + + closeEditModal(data) { + this.setState({ editModal : false }); + + if (data != null) { + AppDispatcher.dispatch({ + type: 'scenarios/start-edit', + data, + token: this.state.sessionToken + }); + } + } + + closeImportModal(data) { + this.setState({ importModal: false }); + + if (data) { + AppDispatcher.dispatch({ + type: 'scenarios/start-add', + data, + token: this.state.sessionToken + }); + } + } + + onModalKeyPress = (event) => { + if (event.key === 'Enter') { + event.preventDefault(); + + this.confirmDeleteModal(); + } + } + + exportScenario(index) { + // filter properties + let scenario = Object.assign({}, this.state.scenarios[index]); + delete scenario.id; + delete scenario.users; + delete scenario.dashboards; + + scenario.simulationModels.forEach(model => { + delete model.simulator; + }); + + // show save dialog + const blob = new Blob([JSON.stringify(scenario, null, 2)], { type: 'application/json' }); + FileSaver.saveAs(blob, 'scenario - ' + scenario.name + '.json'); + } + + onScenarioChecked(index, event) { + const selectedScenarios = Object.assign([], this.state.selectedScenarios); + for (let key in selectedScenarios) { + if (selectedScenarios[key] === index) { + // update existing entry + if (event.target.checked) { + return; + } + + selectedScenarios.splice(key, 1); + + this.setState({ selectedScenarios }); + return; + } + } + + // add new entry + if (event.target.checked === false) { + return; + } + + selectedScenarios.push(index); + this.setState({ selectedScenarios }); + } + + runAction = action => { + for (let index of this.state.selectedScenarios) { + for (let model of this.state.scenarios[index].simulationModels) { + // get simulation model + const simulationModel = this.state.simulationModels.find(m => m != null && m.id === model); + if (simulationModel == null) { + continue; + } + + // get simulator for model + let simulator = null; + for (let sim of this.state.simulators) { + if (sim.id === simulationModel.simulatorID) { + simulator = sim; + } + } + + if (simulator == null) { + continue; + } + + if (action.data.action === 'start') { + action.data.parameters = Object.assign({}, this.state.scenarios[index].startParameters, simulationModel.startParameters); + } + + AppDispatcher.dispatch({ + type: 'simulators/start-action', + simulator, + data: action.data, + token: this.state.sessionToken + }); + } + } + } + + render() { + const buttonStyle = { + marginLeft: '10px' + }; + + return ( +
    +

    Scenarios

    + + + this.onScenarioChecked(index, event)} width='30' /> + + this.setState({ editModal: true, modalScenario: this.state.scenarios[index] })} + onDelete={index => this.setState({ deleteModal: true, modalScenario: this.state.scenarios[index] })} + onExport={index => this.exportScenario(index)} + /> +
    + +
    + +
    + +
    + + +
    + +
    + + this.closeNewModal(data)} /> + this.closeEditModal(data)} scenario={this.state.modalScenario} /> + this.closeImportModal(data)} nodes={this.state.nodes} /> + + +
    + ); + } +} + +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Scenarios)); diff --git a/src/containers/simulation-model.js b/src/containers/simulation-model.js index 9ba7390..2f536ec 100644 --- a/src/containers/simulation-model.js +++ b/src/containers/simulation-model.js @@ -39,7 +39,7 @@ class SimulationModel extends React.Component { } static calculateState(prevState, props) { - const simulationModel = SimulationModelStore.getState().find(m => m._id === props.match.params.simulationModel); + const simulationModel = SimulationModelStore.getState().find(m => m.id === props.match.params.simulationModel); return { simulationModel: simulationModel || {}, @@ -66,11 +66,11 @@ class SimulationModel extends React.Component { token: this.state.sessionToken }); - this.props.history.push('/simulations/' + this.state.simulationModel.simulation); + this.props.history.push('/scenarios/' + this.state.simulationModel.scenarioID); } discardChanges = () => { - this.props.history.push('/simulations/' + this.state.simulationModel.simulation); + this.props.history.push('/scenarios/' + this.state.simulationModel.scenarioID); } handleSimulatorChange = simulator => { @@ -141,14 +141,14 @@ class SimulationModel extends React.Component {
    - Start Parameters + Start Parameters - +
    - + diff --git a/src/data-managers/scenarios-data-manager.js b/src/data-managers/scenarios-data-manager.js new file mode 100644 index 0000000..136ee3d --- /dev/null +++ b/src/data-managers/scenarios-data-manager.js @@ -0,0 +1,60 @@ +/** + * File: scenarios-data-manager.js + * Author: Sonja Happ + * Date: 20.08.2019 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import RestDataManager from './rest-data-manager'; +import RestAPI from "../api/rest-api"; +import AppDispatcher from "../app-dispatcher"; + +class ScenariosDataManager extends RestDataManager { + constructor() { + super('scenario', '/scenarios'); + } + + getSimulationModels(token, id) { + RestAPI.get(this.makeURL('/scenarios/' + id + '/models'), token).then(response => { + AppDispatcher.dispatch({ + type: 'scenarios/simulationmodels', + simulationmodels: response.models + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: 'scenarios/simulationmodels-error', + error: error + }); + }); + } + + getDashboards(token, id) { + RestAPI.get(this.makeURL('/scenarios/' + id + '/dashboards'), token).then(response => { + AppDispatcher.dispatch({ + type: 'scenarios/dashboards', + dashboards: response.dashboards + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: 'scenarios/dashboards-error', + error: error + }); + }); + } + +} +export default new ScenariosDataManager(); diff --git a/src/stores/scenario-store.js b/src/stores/scenario-store.js new file mode 100644 index 0000000..c7e4dc4 --- /dev/null +++ b/src/stores/scenario-store.js @@ -0,0 +1,63 @@ +/** + * File: scenario-store.js + * Author: Sonja Happ + * Date: 20.08.2019 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ************************************************************s*****************/ + +import ArrayStore from './array-store'; +import ScenariosDataManager from '../data-managers/scenarios-data-manager'; +import UsersDataManager from "../data-managers/users-data-manager"; +import SimulatorDataDataManager from "../data-managers/simulator-data-data-manager"; +import {ReduceStore} from "flux/utils"; +import AppDispatcher from "../app-dispatcher"; + +//export default new ArrayStore('scenarios', ScenariosDataManager); + + +class ScenariosStore extends ReduceStore { + constructor() { + super('scenarios', ScenariosDataManager); + } + + getInitialState() { + return { + scenarios: [], + + }; + } + + reduce(state, action) { + switch (action.type) { + case 'scenarios/load-models': + // request simulation model data of scenario + ScenariosDataManager.getSimulationModels(action.token, action.scenarioID); + + return Object.assign({}, state, { token: action.token, simulationmodels: action.simulationmodels}); + + case 'scenarios/load-dashboards': + // request dashboard data of scenario + ScenariosDataManager.getDashboards(action.token, action.scenarioID); + + return Object.assign({}, state, { token: action.token, dashboards: action.dashboards}); + default: + return state; + } + } +} + +export default new ScenariosStore(); From f468b445578ff140d9a5571be89233bcf79a6483 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 20 Aug 2019 14:46:33 +0200 Subject: [PATCH 20/34] Refactoring of js code base: - Grouping js files based on the elements of the data model instead of parent js class - All js files providing functionality for one element of the data model are now in one folder; this makes is easier to implement changes for one element in all affected files/ classes - js files which are common to multiple elements are in the common folder - The new structure is more in alignment with the new Go backend code base structure - This commit does not contain any changes in functionality of the frontend --- .../edit-widget-control-creator.js | 32 +++++++------- src/{containers => }/app.js | 40 ++++++++--------- .../FluxContainerConverter.js | 0 src/{ => common}/api/rest-api.js | 0 src/{ => common}/api/websocket-api.js | 0 src/{ => common}/app-dispatcher.js | 0 src/{stores => common}/array-store.js | 2 +- .../notifications-data-manager.js | 0 .../data-managers/notifications-factory.js | 0 .../data-managers/rest-data-manager.js | 0 .../dialogs/delete-dialog.js | 0 src/{components => common}/dialogs/dialog.js | 0 src/{components => common}/editable-header.js | 0 src/{components => common}/footer.js | 0 src/{components => common}/header-menu.js | 0 src/{components => common}/header.js | 0 src/{components => common}/home.js | 2 +- src/{components => common}/icon.js | 0 src/{components => common}/menu-sidebar.js | 0 .../parameters-editor.js | 0 src/{components => common}/table-column.js | 0 src/{components => common}/table.js | 0 src/{stores => file}/file-store.js | 4 +- .../files-data-manager.js | 6 +-- src/{containers => file}/select-file.js | 14 +++--- .../dialogs => project}/edit-project.js | 2 +- .../dialogs => project}/new-project.js | 2 +- src/{stores => project}/project-store.js | 4 +- src/{containers => project}/project.js | 26 +++++------ .../projects-data-manager.js | 2 +- src/{containers => project}/projects.js | 22 +++++----- src/router.js | 6 +-- .../dialogs => simulation}/edit-simulation.js | 4 +- .../import-simulation.js | 8 ++-- .../dialogs => simulation}/new-simulation.js | 6 +-- .../simulation-store.js | 4 +- src/{containers => simulation}/simulation.js | 24 +++++----- .../simulations-data-manager.js | 2 +- src/{containers => simulation}/simulations.js | 28 ++++++------ .../import-simulation-model.js | 2 +- .../signal-mapping.js | 4 +- .../simulation-model-store.js | 4 +- .../simulation-model.js | 24 +++++----- .../simulation-models-data-manager.js | 4 +- .../dialogs => simulator}/edit-simulator.js | 4 +- .../dialogs => simulator}/import-simulator.js | 10 ++--- .../dialogs => simulator}/new-simulator.js | 2 +- .../select-simulator.js | 6 +-- .../simulator-action.js | 0 .../simulator-data-data-manager.js | 4 +- .../simulator-data-store.js | 4 +- src/{stores => simulator}/simulator-store.js | 6 +-- .../simulators-data-manager.js | 6 +-- src/{containers => simulator}/simulators.js | 24 +++++----- src/{components/dialogs => user}/edit-user.js | 2 +- src/{components => user}/login-form.js | 2 +- src/{containers => user}/login.js | 14 +++--- src/{containers => user}/logout.js | 2 +- src/{components/dialogs => user}/new-user.js | 2 +- src/{stores => user}/user-store.js | 8 ++-- .../users-data-manager.js | 8 ++-- src/{stores => user}/users-store.js | 6 +-- src/{containers => user}/users.js | 20 ++++----- src/{components => visualization}/dropzone.js | 0 .../edit-visualization.js | 2 +- src/{components => visualization}/grid.js | 0 .../import-visualization.js | 2 +- .../new-visualization.js | 2 +- .../toolbox-item.js | 2 +- .../visualization-store.js | 4 +- .../visualization.js | 34 +++++++------- .../visualizations-data-manager.js | 2 +- .../edit-widget-aspect-control.js | 0 .../edit-widget-checkbox-control.js | 0 .../edit-widget-color-control.js | 0 .../edit-widget-color-zones-control.js | 6 +-- .../edit-widget-control-creator.js | 0 .../edit-widget-html-content.js | 0 .../edit-widget-image-control.js | 4 +- .../edit-widget-min-max-control.js | 0 .../edit-widget-number-control.js | 0 .../edit-widget-orientation.js | 2 +- .../edit-widget-parameters-control.js | 2 +- .../edit-widget-signal-control.js | 0 .../edit-widget-signals-control.js | 0 .../edit-widget-simulation-control.js | 0 .../edit-widget-text-control.js | 0 .../edit-widget-text-size-control.js | 0 .../edit-widget-time-control.js | 0 .../dialogs => widget}/edit-widget.js | 4 +- src/{components => widget}/widget-factory.js | 0 .../widget-plot/plot-legend.js | 0 .../widget-plot/plot.js | 0 src/{containers => widget}/widget.js | 44 +++++++++---------- src/{components => widget}/widgets/action.js | 2 +- src/{components => widget}/widgets/box.js | 2 +- src/{components => widget}/widgets/button.js | 0 .../widgets/custom-action.js | 8 ++-- src/{components => widget}/widgets/gauge.js | 0 src/{components => widget}/widgets/html.js | 0 src/{components => widget}/widgets/image.js | 2 +- src/{components => widget}/widgets/input.js | 0 src/{components => widget}/widgets/label.js | 2 +- src/{components => widget}/widgets/lamp.js | 2 +- .../widgets/plot-table.js | 0 src/{components => widget}/widgets/plot.js | 0 src/{components => widget}/widgets/slider.js | 0 src/{components => widget}/widgets/table.js | 4 +- .../widgets/topology.js | 0 src/{components => widget}/widgets/value.js | 0 110 files changed, 270 insertions(+), 270 deletions(-) rename src/__tests__/{components/dialog => widget}/edit-widget-control-creator.js (68%) rename src/{containers => }/app.js (82%) rename src/{containers => common}/FluxContainerConverter.js (100%) rename src/{ => common}/api/rest-api.js (100%) rename src/{ => common}/api/websocket-api.js (100%) rename src/{ => common}/app-dispatcher.js (100%) rename src/{stores => common}/array-store.js (98%) rename src/{ => common}/data-managers/notifications-data-manager.js (100%) rename src/{ => common}/data-managers/notifications-factory.js (100%) rename src/{ => common}/data-managers/rest-data-manager.js (100%) rename src/{components => common}/dialogs/delete-dialog.js (100%) rename src/{components => common}/dialogs/dialog.js (100%) rename src/{components => common}/editable-header.js (100%) rename src/{components => common}/footer.js (100%) rename src/{components => common}/header-menu.js (100%) rename src/{components => common}/header.js (100%) rename src/{components => common}/home.js (99%) rename src/{components => common}/icon.js (100%) rename src/{components => common}/menu-sidebar.js (100%) rename src/{components => common}/parameters-editor.js (100%) rename src/{components => common}/table-column.js (100%) rename src/{components => common}/table.js (100%) rename src/{stores => file}/file-store.js (93%) rename src/{data-managers => file}/files-data-manager.js (90%) rename src/{containers => file}/select-file.js (93%) rename src/{components/dialogs => project}/edit-project.js (98%) rename src/{components/dialogs => project}/new-project.js (98%) rename src/{stores => project}/project-store.js (89%) rename src/{containers => project}/project.js (89%) rename src/{data-managers => project}/projects-data-manager.js (92%) rename src/{containers => project}/projects.js (87%) rename src/{components/dialogs => simulation}/edit-simulation.js (96%) rename src/{components/dialogs => simulation}/import-simulation.js (97%) rename src/{components/dialogs => simulation}/new-simulation.js (96%) rename src/{stores => simulation}/simulation-store.js (88%) rename src/{containers => simulation}/simulation.js (92%) rename src/{data-managers => simulation}/simulations-data-manager.js (93%) rename src/{containers => simulation}/simulations.js (91%) rename src/{components/dialogs => simulationmodel}/import-simulation-model.js (98%) rename src/{components => simulationmodel}/signal-mapping.js (97%) rename src/{stores => simulationmodel}/simulation-model-store.js (87%) rename src/{containers => simulationmodel}/simulation-model.js (89%) rename src/{data-managers => simulationmodel}/simulation-models-data-manager.js (92%) rename src/{components/dialogs => simulator}/edit-simulator.js (96%) rename src/{components/dialogs => simulator}/import-simulator.js (96%) rename src/{components/dialogs => simulator}/new-simulator.js (98%) rename src/{containers => simulator}/select-simulator.js (93%) rename src/{components => simulator}/simulator-action.js (100%) rename src/{data-managers => simulator}/simulator-data-data-manager.js (97%) rename src/{stores => simulator}/simulator-data-store.js (96%) rename src/{stores => simulator}/simulator-store.js (92%) rename src/{data-managers => simulator}/simulators-data-manager.js (89%) rename src/{containers => simulator}/simulators.js (93%) rename src/{components/dialogs => user}/edit-user.js (98%) rename src/{components => user}/login-form.js (98%) rename src/{containers => user}/login.js (87%) rename src/{containers => user}/logout.js (95%) rename src/{components/dialogs => user}/new-user.js (98%) rename src/{stores => user}/user-store.js (91%) rename src/{data-managers => user}/users-data-manager.js (91%) rename src/{stores => user}/users-store.js (91%) rename src/{containers => user}/users.js (88%) rename src/{components => visualization}/dropzone.js (100%) rename src/{components/dialogs => visualization}/edit-visualization.js (98%) rename src/{components => visualization}/grid.js (100%) rename src/{components/dialogs => visualization}/import-visualization.js (98%) rename src/{components/dialogs => visualization}/new-visualization.js (98%) rename src/{components => visualization}/toolbox-item.js (98%) rename src/{stores => visualization}/visualization-store.js (88%) rename src/{containers => visualization}/visualization.js (95%) rename src/{data-managers => visualization}/visualizations-data-manager.js (92%) rename src/{components/dialogs => widget}/edit-widget-aspect-control.js (100%) rename src/{components/dialogs => widget}/edit-widget-checkbox-control.js (100%) rename src/{components/dialogs => widget}/edit-widget-color-control.js (100%) rename src/{components/dialogs => widget}/edit-widget-color-zones-control.js (96%) rename src/{components/dialogs => widget}/edit-widget-control-creator.js (100%) rename src/{components/dialogs => widget}/edit-widget-html-content.js (100%) rename src/{components/dialogs => widget}/edit-widget-image-control.js (98%) rename src/{components/dialogs => widget}/edit-widget-min-max-control.js (100%) rename src/{components/dialogs => widget}/edit-widget-number-control.js (100%) rename src/{components/dialogs => widget}/edit-widget-orientation.js (98%) rename src/{components/dialogs => widget}/edit-widget-parameters-control.js (96%) rename src/{components/dialogs => widget}/edit-widget-signal-control.js (100%) rename src/{components/dialogs => widget}/edit-widget-signals-control.js (100%) rename src/{components/dialogs => widget}/edit-widget-simulation-control.js (100%) rename src/{components/dialogs => widget}/edit-widget-text-control.js (100%) rename src/{components/dialogs => widget}/edit-widget-text-size-control.js (100%) rename src/{components/dialogs => widget}/edit-widget-time-control.js (100%) rename src/{components/dialogs => widget}/edit-widget.js (98%) rename src/{components => widget}/widget-factory.js (100%) rename src/{components => widget}/widget-plot/plot-legend.js (100%) rename src/{components => widget}/widget-plot/plot.js (100%) rename src/{containers => widget}/widget.js (88%) rename src/{components => widget}/widgets/action.js (97%) rename src/{components => widget}/widgets/box.js (95%) rename src/{components => widget}/widgets/button.js (100%) rename src/{components => widget}/widgets/custom-action.js (90%) rename src/{components => widget}/widgets/gauge.js (100%) rename src/{components => widget}/widgets/html.js (100%) rename src/{components => widget}/widgets/image.js (97%) rename src/{components => widget}/widgets/input.js (100%) rename src/{components => widget}/widgets/label.js (94%) rename src/{components => widget}/widgets/lamp.js (96%) rename src/{components => widget}/widgets/plot-table.js (100%) rename src/{components => widget}/widgets/plot.js (100%) rename src/{components => widget}/widgets/slider.js (100%) rename src/{components => widget}/widgets/table.js (96%) rename src/{components => widget}/widgets/topology.js (100%) rename src/{components => widget}/widgets/value.js (100%) diff --git a/src/__tests__/components/dialog/edit-widget-control-creator.js b/src/__tests__/widget/edit-widget-control-creator.js similarity index 68% rename from src/__tests__/components/dialog/edit-widget-control-creator.js rename to src/__tests__/widget/edit-widget-control-creator.js index d93cdbe..df9ce22 100644 --- a/src/__tests__/components/dialog/edit-widget-control-creator.js +++ b/src/__tests__/widget/edit-widget-control-creator.js @@ -1,22 +1,22 @@ import { expect } from 'chai'; -import createControls from '../../../components/dialogs/edit-widget-control-creator'; -import EditWidgetTextControl from '../../../components/dialogs/edit-widget-text-control'; -import EditWidgetColorControl from '../../../components/dialogs/edit-widget-color-control'; -import EditWidgetTimeControl from '../../../components/dialogs/edit-widget-time-control'; -import EditImageWidgetControl from '../../../components/dialogs/edit-widget-image-control'; -import EditWidgetSimulationControl from '../../../components/dialogs/edit-widget-simulation-control'; -import EditWidgetSignalControl from '../../../components/dialogs/edit-widget-signal-control'; -import EditWidgetSignalsControl from '../../../components/dialogs/edit-widget-signals-control'; -import EditWidgetOrientation from '../../../components/dialogs/edit-widget-orientation'; -import EditWidgetTextSizeControl from '../../../components/dialogs/edit-widget-text-size-control'; -import EditWidgetAspectControl from '../../../components/dialogs/edit-widget-aspect-control'; -import EditWidgetCheckboxControl from '../../../components/dialogs/edit-widget-checkbox-control'; -import EditWidgetMinMaxControl from '../../../components/dialogs/edit-widget-min-max-control'; -import EditWidgetColorZonesControl from '../../../components/dialogs/edit-widget-color-zones-control'; -import EditWidgetHTMLContent from '../../../components/dialogs/edit-widget-html-content'; -import EditWidgetNumberControl from '../../../components/dialogs/edit-widget-number-control'; +import createControls from '../widget/edit-widget-control-creator'; +import EditWidgetTextControl from '../widget/edit-widget-text-control'; +import EditWidgetColorControl from '../widget/edit-widget-color-control'; +import EditWidgetTimeControl from '../widget/edit-widget-time-control'; +import EditImageWidgetControl from '../widget/edit-widget-image-control'; +import EditWidgetSimulationControl from '../widget/edit-widget-simulation-control'; +import EditWidgetSignalControl from '../widget/edit-widget-signal-control'; +import EditWidgetSignalsControl from '../widget/edit-widget-signals-control'; +import EditWidgetOrientation from '../widget/edit-widget-orientation'; +import EditWidgetTextSizeControl from '../widget/edit-widget-text-size-control'; +import EditWidgetAspectControl from '../widget/edit-widget-aspect-control'; +import EditWidgetCheckboxControl from '../widget/edit-widget-checkbox-control'; +import EditWidgetMinMaxControl from '../widget/edit-widget-min-max-control'; +import EditWidgetColorZonesControl from '../widget/edit-widget-color-zones-control'; +import EditWidgetHTMLContent from '../widget/edit-widget-html-content'; +import EditWidgetNumberControl from '../widget/edit-widget-number-control'; describe('edit widget control creator', () => { it('should not return null', () => { diff --git a/src/containers/app.js b/src/app.js similarity index 82% rename from src/containers/app.js rename to src/app.js index 763e012..9f4f0ac 100644 --- a/src/containers/app.js +++ b/src/app.js @@ -28,28 +28,28 @@ import { Redirect, Route } from 'react-router-dom'; import { Col } from 'react-bootstrap'; import { Hidden } from 'react-grid-system' -import AppDispatcher from '../app-dispatcher'; -import SimulationStore from '../stores/simulation-store'; -import SimulatorStore from '../stores/simulator-store'; -import UserStore from '../stores/user-store'; -import NotificationsDataManager from '../data-managers/notifications-data-manager'; +import AppDispatcher from './common/app-dispatcher'; +import SimulationStore from './simulation/simulation-store'; +import SimulatorStore from './simulator/simulator-store'; +import UserStore from './user/user-store'; +import NotificationsDataManager from './common/data-managers/notifications-data-manager'; -import Home from '../components/home'; -import Header from '../components/header'; -import Footer from '../components/footer'; -import SidebarMenu from '../components/menu-sidebar'; -import HeaderMenu from '../components/header-menu'; +import Home from './common/home'; +import Header from './common/header'; +import Footer from './common/footer'; +import SidebarMenu from './common/menu-sidebar'; +import HeaderMenu from './common/header-menu'; -import Projects from './projects'; -import Project from './project'; -import Simulators from './simulators'; -import Visualization from './visualization'; -import Simulations from './simulations'; -import Simulation from './simulation'; -import SimulationModel from './simulation-model'; -import Users from './users'; +import Projects from './project/projects'; +import Project from './project/project'; +import Simulators from './simulator/simulators'; +import Visualization from './visualization/visualization'; +import Simulations from './simulation/simulations'; +import Simulation from './simulation/simulation'; +import SimulationModel from './simulationmodel/simulation-model'; +import Users from './user/users'; -import '../styles/app.css'; +import './styles/app.css'; class App extends React.Component { @@ -161,6 +161,6 @@ class App extends React.Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('./common/FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(App)); //DragDropContext(HTML5Backend)(Container.create(App)); diff --git a/src/containers/FluxContainerConverter.js b/src/common/FluxContainerConverter.js similarity index 100% rename from src/containers/FluxContainerConverter.js rename to src/common/FluxContainerConverter.js diff --git a/src/api/rest-api.js b/src/common/api/rest-api.js similarity index 100% rename from src/api/rest-api.js rename to src/common/api/rest-api.js diff --git a/src/api/websocket-api.js b/src/common/api/websocket-api.js similarity index 100% rename from src/api/websocket-api.js rename to src/common/api/websocket-api.js diff --git a/src/app-dispatcher.js b/src/common/app-dispatcher.js similarity index 100% rename from src/app-dispatcher.js rename to src/common/app-dispatcher.js diff --git a/src/stores/array-store.js b/src/common/array-store.js similarity index 98% rename from src/stores/array-store.js rename to src/common/array-store.js index 2d4be7c..70e9c9e 100644 --- a/src/stores/array-store.js +++ b/src/common/array-store.js @@ -21,7 +21,7 @@ import { ReduceStore } from 'flux/utils'; -import AppDispatcher from '../app-dispatcher'; +import AppDispatcher from './app-dispatcher'; class ArrayStore extends ReduceStore { constructor(type, dataManager) { diff --git a/src/data-managers/notifications-data-manager.js b/src/common/data-managers/notifications-data-manager.js similarity index 100% rename from src/data-managers/notifications-data-manager.js rename to src/common/data-managers/notifications-data-manager.js diff --git a/src/data-managers/notifications-factory.js b/src/common/data-managers/notifications-factory.js similarity index 100% rename from src/data-managers/notifications-factory.js rename to src/common/data-managers/notifications-factory.js diff --git a/src/data-managers/rest-data-manager.js b/src/common/data-managers/rest-data-manager.js similarity index 100% rename from src/data-managers/rest-data-manager.js rename to src/common/data-managers/rest-data-manager.js diff --git a/src/components/dialogs/delete-dialog.js b/src/common/dialogs/delete-dialog.js similarity index 100% rename from src/components/dialogs/delete-dialog.js rename to src/common/dialogs/delete-dialog.js diff --git a/src/components/dialogs/dialog.js b/src/common/dialogs/dialog.js similarity index 100% rename from src/components/dialogs/dialog.js rename to src/common/dialogs/dialog.js diff --git a/src/components/editable-header.js b/src/common/editable-header.js similarity index 100% rename from src/components/editable-header.js rename to src/common/editable-header.js diff --git a/src/components/footer.js b/src/common/footer.js similarity index 100% rename from src/components/footer.js rename to src/common/footer.js diff --git a/src/components/header-menu.js b/src/common/header-menu.js similarity index 100% rename from src/components/header-menu.js rename to src/common/header-menu.js diff --git a/src/components/header.js b/src/common/header.js similarity index 100% rename from src/components/header.js rename to src/common/header.js diff --git a/src/components/home.js b/src/common/home.js similarity index 99% rename from src/components/home.js rename to src/common/home.js index 70dedbd..e866249 100644 --- a/src/components/home.js +++ b/src/common/home.js @@ -26,7 +26,7 @@ import React from 'react'; //import RestAPI from '../api/rest-api'; import config from '../config'; -import UserStore from "../stores/user-store"; +import UserStore from "../user/user-store"; class Home extends React.Component { constructor(props) { diff --git a/src/components/icon.js b/src/common/icon.js similarity index 100% rename from src/components/icon.js rename to src/common/icon.js diff --git a/src/components/menu-sidebar.js b/src/common/menu-sidebar.js similarity index 100% rename from src/components/menu-sidebar.js rename to src/common/menu-sidebar.js diff --git a/src/components/parameters-editor.js b/src/common/parameters-editor.js similarity index 100% rename from src/components/parameters-editor.js rename to src/common/parameters-editor.js diff --git a/src/components/table-column.js b/src/common/table-column.js similarity index 100% rename from src/components/table-column.js rename to src/common/table-column.js diff --git a/src/components/table.js b/src/common/table.js similarity index 100% rename from src/components/table.js rename to src/common/table.js diff --git a/src/stores/file-store.js b/src/file/file-store.js similarity index 93% rename from src/stores/file-store.js rename to src/file/file-store.js index 1437652..f2d3a07 100644 --- a/src/stores/file-store.js +++ b/src/file/file-store.js @@ -19,8 +19,8 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import ArrayStore from './array-store'; -import FilesDataManager from '../data-managers/files-data-manager'; +import ArrayStore from '../common/array-store'; +import FilesDataManager from './files-data-manager'; class FileStore extends ArrayStore { constructor() { diff --git a/src/data-managers/files-data-manager.js b/src/file/files-data-manager.js similarity index 90% rename from src/data-managers/files-data-manager.js rename to src/file/files-data-manager.js index b9fbd91..e92aeff 100644 --- a/src/data-managers/files-data-manager.js +++ b/src/file/files-data-manager.js @@ -19,9 +19,9 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import RestDataManager from './rest-data-manager'; -import RestAPI from '../api/rest-api'; -import AppDispatcher from '../app-dispatcher'; +import RestDataManager from '../common/data-managers/rest-data-manager'; +import RestAPI from '../common/api/rest-api'; +import AppDispatcher from '../common/app-dispatcher'; class FilesDataManager extends RestDataManager { constructor() { diff --git a/src/containers/select-file.js b/src/file/select-file.js similarity index 93% rename from src/containers/select-file.js rename to src/file/select-file.js index 3eb97c1..fafe98f 100644 --- a/src/containers/select-file.js +++ b/src/file/select-file.js @@ -23,10 +23,10 @@ import React from 'react'; import { Container } from 'flux/utils'; import { FormGroup, FormControl, FormLabel, Button, ProgressBar, Col } from 'react-bootstrap'; -import FileStore from '../stores/file-store'; -import UserStore from '../stores/user-store'; +import FileStore from './file-store'; +import UserStore from '../user/user-store'; -import AppDispatcher from '../app-dispatcher'; +import AppDispatcher from '../common/app-dispatcher'; class SelectFile extends React.Component { static getStores() { @@ -107,12 +107,12 @@ class SelectFile extends React.Component { } render() { - const fileOptions = this.state.files.map(f => + const fileOptions = this.state.files.map(f => ); const progressBarStyle = { - marginLeft: '100px', + marginLeft: '100px', marginTop: '-25px' }; @@ -121,7 +121,7 @@ class SelectFile extends React.Component { {this.props.name} - + {fileOptions} @@ -148,5 +148,5 @@ class SelectFile extends React.Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(SelectFile)); diff --git a/src/components/dialogs/edit-project.js b/src/project/edit-project.js similarity index 98% rename from src/components/dialogs/edit-project.js rename to src/project/edit-project.js index 6f2081d..918633d 100644 --- a/src/components/dialogs/edit-project.js +++ b/src/project/edit-project.js @@ -22,7 +22,7 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; class EditProjectDialog extends React.Component { valid: true; diff --git a/src/components/dialogs/new-project.js b/src/project/new-project.js similarity index 98% rename from src/components/dialogs/new-project.js rename to src/project/new-project.js index b9a2bbd..c18cd89 100644 --- a/src/components/dialogs/new-project.js +++ b/src/project/new-project.js @@ -22,7 +22,7 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; class NewProjectDialog extends React.Component { valid: false; diff --git a/src/stores/project-store.js b/src/project/project-store.js similarity index 89% rename from src/stores/project-store.js rename to src/project/project-store.js index 0df9380..99b9bba 100644 --- a/src/stores/project-store.js +++ b/src/project/project-store.js @@ -19,7 +19,7 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import ArrayStore from './array-store'; -import ProjectsDataManager from '../data-managers/projects-data-manager'; +import ArrayStore from '../common/array-store'; +import ProjectsDataManager from './projects-data-manager'; export default new ArrayStore('projects', ProjectsDataManager); diff --git a/src/containers/project.js b/src/project/project.js similarity index 89% rename from src/containers/project.js rename to src/project/project.js index 74e2da4..78679d7 100644 --- a/src/containers/project.js +++ b/src/project/project.js @@ -24,20 +24,20 @@ import { Container } from 'flux/utils'; import { Button } from 'react-bootstrap'; import FileSaver from 'file-saver'; -import AppDispatcher from '../app-dispatcher'; -import ProjectStore from '../stores/project-store'; -import UserStore from '../stores/user-store'; -import VisualizationStore from '../stores/visualization-store'; -import SimulationStore from '../stores/simulation-store'; +import AppDispatcher from '../common/app-dispatcher'; +import ProjectStore from './project-store'; +import UserStore from '../user/user-store'; +import VisualizationStore from '../visualization/visualization-store'; +import SimulationStore from '../simulation/simulation-store'; -import Icon from '../components/icon'; -import CustomTable from '../components/table'; -import TableColumn from '../components/table-column'; -import NewVisualzationDialog from '../components/dialogs/new-visualization'; -import EditVisualizationDialog from '../components/dialogs/edit-visualization'; -import ImportVisualizationDialog from '../components/dialogs/import-visualization'; +import Icon from '../common/icon'; +import CustomTable from '../common/table'; +import TableColumn from '../common/table-column'; +import NewVisualzationDialog from '../visualization/new-visualization'; +import EditVisualizationDialog from '../visualization/edit-visualization'; +import ImportVisualizationDialog from '../visualization/import-visualization'; -import DeleteDialog from '../components/dialogs/delete-dialog'; +import DeleteDialog from '../common/dialogs/delete-dialog'; class Visualizations extends Component { static getStores() { @@ -231,5 +231,5 @@ class Visualizations extends Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(Visualizations), {withProps: true}); diff --git a/src/data-managers/projects-data-manager.js b/src/project/projects-data-manager.js similarity index 92% rename from src/data-managers/projects-data-manager.js rename to src/project/projects-data-manager.js index e1b8167..669e58a 100644 --- a/src/data-managers/projects-data-manager.js +++ b/src/project/projects-data-manager.js @@ -19,6 +19,6 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import RestDataManager from './rest-data-manager'; +import RestDataManager from '../common/data-managers/rest-data-manager'; export default new RestDataManager('project', '/projects'); diff --git a/src/containers/projects.js b/src/project/projects.js similarity index 87% rename from src/containers/projects.js rename to src/project/projects.js index d42bd64..4aba7cf 100644 --- a/src/containers/projects.js +++ b/src/project/projects.js @@ -23,18 +23,18 @@ import React from 'react'; import { Container } from 'flux/utils'; import { Button } from 'react-bootstrap'; -import AppDispatcher from '../app-dispatcher'; -import ProjectStore from '../stores/project-store'; -import UserStore from '../stores/user-store'; -import SimulationStore from '../stores/simulation-store'; +import AppDispatcher from '../common/app-dispatcher'; +import ProjectStore from './project-store'; +import UserStore from '../user/user-store'; +import SimulationStore from '../simulation/simulation-store'; -import Icon from '../components/icon'; -import Table from '../components/table'; -import TableColumn from '../components/table-column'; -import NewProjectDialog from '../components/dialogs/new-project'; -import EditProjectDialog from '../components/dialogs/edit-project'; +import Icon from '../common/icon'; +import Table from '../common/table'; +import TableColumn from '../common/table-column'; +import NewProjectDialog from './new-project'; +import EditProjectDialog from './edit-project'; -import DeleteDialog from '../components/dialogs/delete-dialog'; +import DeleteDialog from '../common/dialogs/delete-dialog'; class Projects extends React.Component { static getStores() { @@ -156,5 +156,5 @@ class Projects extends React.Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(Projects)); diff --git a/src/router.js b/src/router.js index d9f3e45..aee9c0f 100644 --- a/src/router.js +++ b/src/router.js @@ -22,9 +22,9 @@ import React from 'react'; import { BrowserRouter, Route, Switch } from 'react-router-dom'; -import App from './containers/app'; -import Login from './containers/login'; -import Logout from './containers/logout'; +import App from './app'; +import Login from './user/login'; +import Logout from './user/logout'; class Root extends React.Component { render() { diff --git a/src/components/dialogs/edit-simulation.js b/src/simulation/edit-simulation.js similarity index 96% rename from src/components/dialogs/edit-simulation.js rename to src/simulation/edit-simulation.js index a312406..7a99ab6 100644 --- a/src/components/dialogs/edit-simulation.js +++ b/src/simulation/edit-simulation.js @@ -22,8 +22,8 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; -import ParametersEditor from '../parameters-editor'; +import Dialog from '../common/dialogs/dialog'; +import ParametersEditor from '../common/parameters-editor'; class EditSimulationDialog extends React.Component { valid = true; diff --git a/src/components/dialogs/import-simulation.js b/src/simulation/import-simulation.js similarity index 97% rename from src/components/dialogs/import-simulation.js rename to src/simulation/import-simulation.js index 1aadb37..afb1438 100644 --- a/src/components/dialogs/import-simulation.js +++ b/src/simulation/import-simulation.js @@ -22,8 +22,8 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; -import ParametersEditor from '../parameters-editor'; +import Dialog from '../common/dialogs/dialog'; +import ParametersEditor from '../common/parameters-editor'; class ImportSimulationDialog extends React.Component { valid = false; @@ -47,7 +47,7 @@ class ImportSimulationDialog extends React.Component { return; } - + if (this.valid && this.props.onClose != null) { this.props.onClose(this.state); } @@ -62,7 +62,7 @@ class ImportSimulationDialog extends React.Component { return; } - + this.setState({ [e.target.id]: e.target.value }); } diff --git a/src/components/dialogs/new-simulation.js b/src/simulation/new-simulation.js similarity index 96% rename from src/components/dialogs/new-simulation.js rename to src/simulation/new-simulation.js index 3d32e2d..a6b1c8f 100644 --- a/src/components/dialogs/new-simulation.js +++ b/src/simulation/new-simulation.js @@ -22,8 +22,8 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; -import ParametersEditor from '../parameters-editor'; +import Dialog from '../common/dialogs/dialog'; +import ParametersEditor from '../common/parameters-editor'; class NewSimulationDialog extends React.Component { valid = false; @@ -42,7 +42,7 @@ class NewSimulationDialog extends React.Component { if (this.props.onClose != null) { this.props.onClose(); } - + return; } diff --git a/src/stores/simulation-store.js b/src/simulation/simulation-store.js similarity index 88% rename from src/stores/simulation-store.js rename to src/simulation/simulation-store.js index 87f4676..fbc63eb 100644 --- a/src/stores/simulation-store.js +++ b/src/simulation/simulation-store.js @@ -19,7 +19,7 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import ArrayStore from './array-store'; -import SimulationsDataManager from '../data-managers/simulations-data-manager'; +import ArrayStore from '../common/array-store'; +import SimulationsDataManager from './simulations-data-manager'; export default new ArrayStore('simulations', SimulationsDataManager); diff --git a/src/containers/simulation.js b/src/simulation/simulation.js similarity index 92% rename from src/containers/simulation.js rename to src/simulation/simulation.js index 7a66ea1..db49b0f 100644 --- a/src/containers/simulation.js +++ b/src/simulation/simulation.js @@ -25,19 +25,19 @@ import { Button } from 'react-bootstrap'; import FileSaver from 'file-saver'; import _ from 'lodash'; -import SimulationStore from '../stores/simulation-store'; -import SimulatorStore from '../stores/simulator-store'; -import SimulationModelStore from '../stores/simulation-model-store'; -import UserStore from '../stores/user-store'; -import AppDispatcher from '../app-dispatcher'; +import SimulationStore from './simulation-store'; +import SimulatorStore from '../simulator/simulator-store'; +import SimulationModelStore from '../simulationmodel/simulation-model-store'; +import UserStore from '../user/user-store'; +import AppDispatcher from '../common/app-dispatcher'; -import Icon from '../components/icon'; -import Table from '../components/table'; -import TableColumn from '../components/table-column'; -import ImportSimulationModelDialog from '../components/dialogs/import-simulation-model'; +import Icon from '../common/icon'; +import Table from '../common/table'; +import TableColumn from '../common/table-column'; +import ImportSimulationModelDialog from '../simulationmodel/import-simulation-model'; -import SimulatorAction from '../components/simulator-action'; -import DeleteDialog from '../components/dialogs/delete-dialog'; +import SimulatorAction from '../simulator/simulator-action'; +import DeleteDialog from '../common/dialogs/delete-dialog'; class Simulation extends React.Component { static getStores() { @@ -285,5 +285,5 @@ class Simulation extends React.Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(Simulation), { withProps: true }); diff --git a/src/data-managers/simulations-data-manager.js b/src/simulation/simulations-data-manager.js similarity index 93% rename from src/data-managers/simulations-data-manager.js rename to src/simulation/simulations-data-manager.js index 30885aa..3090820 100644 --- a/src/data-managers/simulations-data-manager.js +++ b/src/simulation/simulations-data-manager.js @@ -19,6 +19,6 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import RestDataManager from './rest-data-manager'; +import RestDataManager from '../common/data-managers/rest-data-manager'; export default new RestDataManager('simulation', '/simulations', [ '_id', 'name', 'projects', 'models', 'startParameters' ]); diff --git a/src/containers/simulations.js b/src/simulation/simulations.js similarity index 91% rename from src/containers/simulations.js rename to src/simulation/simulations.js index 5f9429f..c74801c 100644 --- a/src/containers/simulations.js +++ b/src/simulation/simulations.js @@ -24,21 +24,21 @@ import { Container } from 'flux/utils'; import { Button } from 'react-bootstrap'; import FileSaver from 'file-saver'; -import AppDispatcher from '../app-dispatcher'; -import SimulationStore from '../stores/simulation-store'; -import UserStore from '../stores/user-store'; -import SimulatorStore from '../stores/simulator-store'; -import SimulationModelStore from '../stores/simulation-model-store'; +import AppDispatcher from '../common/app-dispatcher'; +import SimulationStore from './simulation-store'; +import UserStore from '../user/user-store'; +import SimulatorStore from '../simulator/simulator-store'; +import SimulationModelStore from '../simulationmodel/simulation-model-store'; -import Icon from '../components/icon'; -import Table from '../components/table'; -import TableColumn from '../components/table-column'; -import NewSimulationDialog from '../components/dialogs/new-simulation'; -import EditSimulationDialog from '../components/dialogs/edit-simulation'; -import ImportSimulationDialog from '../components/dialogs/import-simulation'; +import Icon from '../common/icon'; +import Table from '../common/table'; +import TableColumn from '../common/table-column'; +import NewSimulationDialog from './new-simulation'; +import EditSimulationDialog from './edit-simulation'; +import ImportSimulationDialog from './import-simulation'; -import SimulatorAction from '../components/simulator-action'; -import DeleteDialog from '../components/dialogs/delete-dialog'; +import SimulatorAction from '../simulator/simulator-action'; +import DeleteDialog from '../common/dialogs/delete-dialog'; class Simulations extends Component { static getStores() { @@ -325,5 +325,5 @@ class Simulations extends Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(Simulations)); diff --git a/src/components/dialogs/import-simulation-model.js b/src/simulationmodel/import-simulation-model.js similarity index 98% rename from src/components/dialogs/import-simulation-model.js rename to src/simulationmodel/import-simulation-model.js index 55e7a2b..991c76a 100644 --- a/src/components/dialogs/import-simulation-model.js +++ b/src/simulationmodel/import-simulation-model.js @@ -23,7 +23,7 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import _ from 'lodash'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; class ImportSimulationModelDialog extends React.Component { imported = false; diff --git a/src/components/signal-mapping.js b/src/simulationmodel/signal-mapping.js similarity index 97% rename from src/components/signal-mapping.js rename to src/simulationmodel/signal-mapping.js index 0a66ac5..ca65eac 100644 --- a/src/components/signal-mapping.js +++ b/src/simulationmodel/signal-mapping.js @@ -24,8 +24,8 @@ import PropTypes from 'prop-types'; import { FormGroup, FormControl, FormLabel, FormText } from 'react-bootstrap'; import validator from 'validator'; -import Table from './table'; -import TableColumn from './table-column'; +import Table from '../common/table'; +import TableColumn from '../common/table-column'; class SignalMapping extends React.Component { constructor(props) { diff --git a/src/stores/simulation-model-store.js b/src/simulationmodel/simulation-model-store.js similarity index 87% rename from src/stores/simulation-model-store.js rename to src/simulationmodel/simulation-model-store.js index 73d3dd2..0f06101 100644 --- a/src/stores/simulation-model-store.js +++ b/src/simulationmodel/simulation-model-store.js @@ -19,7 +19,7 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import ArrayStore from './array-store'; -import SimulationModelsDataManager from '../data-managers/simulation-models-data-manager'; +import ArrayStore from '../common/array-store'; +import SimulationModelsDataManager from './simulation-models-data-manager'; export default new ArrayStore('simulationModels', SimulationModelsDataManager); diff --git a/src/containers/simulation-model.js b/src/simulationmodel/simulation-model.js similarity index 89% rename from src/containers/simulation-model.js rename to src/simulationmodel/simulation-model.js index 9ba7390..6867f66 100644 --- a/src/containers/simulation-model.js +++ b/src/simulationmodel/simulation-model.js @@ -23,15 +23,15 @@ import React from 'react'; import { Container } from 'flux/utils'; import { Button, Col, Form, FormLabel } from 'react-bootstrap'; -import SimulationModelStore from '../stores/simulation-model-store'; -import UserStore from '../stores/user-store'; -import AppDispatcher from '../app-dispatcher'; +import SimulationModelStore from './simulation-model-store'; +import UserStore from '../user/user-store'; +import AppDispatcher from '../common/app-dispatcher'; -import SelectSimulator from './select-simulator'; -import SelectFile from './select-file'; -import SignalMapping from '../components/signal-mapping'; -import EditableHeader from '../components/editable-header'; -import ParametersEditor from '../components/parameters-editor'; +import SelectSimulator from '../simulator/select-simulator'; +import SelectFile from '../file/select-file'; +import SignalMapping from './signal-mapping'; +import EditableHeader from '../common/editable-header'; +import ParametersEditor from '../common/parameters-editor'; class SimulationModel extends React.Component { static getStores() { @@ -141,14 +141,14 @@ class SimulationModel extends React.Component {
    - Start Parameters + Start Parameters - +
    - + @@ -168,5 +168,5 @@ class SimulationModel extends React.Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(SimulationModel), { withProps: true }); diff --git a/src/data-managers/simulation-models-data-manager.js b/src/simulationmodel/simulation-models-data-manager.js similarity index 92% rename from src/data-managers/simulation-models-data-manager.js rename to src/simulationmodel/simulation-models-data-manager.js index 5496268..cd41baf 100644 --- a/src/data-managers/simulation-models-data-manager.js +++ b/src/simulationmodel/simulation-models-data-manager.js @@ -19,8 +19,8 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import RestDataManager from './rest-data-manager'; -import AppDispatcher from '../app-dispatcher'; +import RestDataManager from '../common/data-managers/rest-data-manager'; +import AppDispatcher from '../common/app-dispatcher'; class SimulationModelDataManager extends RestDataManager { constructor() { diff --git a/src/components/dialogs/edit-simulator.js b/src/simulator/edit-simulator.js similarity index 96% rename from src/components/dialogs/edit-simulator.js rename to src/simulator/edit-simulator.js index 89ff7e7..17358ad 100644 --- a/src/components/dialogs/edit-simulator.js +++ b/src/simulator/edit-simulator.js @@ -23,8 +23,8 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import _ from 'lodash'; -import Dialog from './dialog'; -import ParametersEditor from '../parameters-editor'; +import Dialog from '../common/dialogs/dialog'; +import ParametersEditor from '../common/parameters-editor'; class EditSimulatorDialog extends React.Component { valid = true; diff --git a/src/components/dialogs/import-simulator.js b/src/simulator/import-simulator.js similarity index 96% rename from src/components/dialogs/import-simulator.js rename to src/simulator/import-simulator.js index e884002..4368c60 100644 --- a/src/components/dialogs/import-simulator.js +++ b/src/simulator/import-simulator.js @@ -23,7 +23,7 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import _ from 'lodash'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; class ImportSimulatorDialog extends React.Component { valid = false; @@ -42,7 +42,7 @@ class ImportSimulatorDialog extends React.Component { onClose(canceled) { if (canceled === false) { if (this.valid) { - const data = { + const data = { properties: { name: this.state.name }, @@ -83,10 +83,10 @@ class ImportSimulatorDialog extends React.Component { // read simulator const simulator = JSON.parse(event.target.result); self.imported = true; - self.setState({ - name: _.get(simulator, 'properties.name') || _.get(simulator, 'rawProperties.name'), + self.setState({ + name: _.get(simulator, 'properties.name') || _.get(simulator, 'rawProperties.name'), endpoint: _.get(simulator, 'properties.endpoint') || _.get(simulator, 'rawProperties.endpoint'), - uuid: simulator.uuid + uuid: simulator.uuid }); }; diff --git a/src/components/dialogs/new-simulator.js b/src/simulator/new-simulator.js similarity index 98% rename from src/components/dialogs/new-simulator.js rename to src/simulator/new-simulator.js index ea7335a..6116d12 100644 --- a/src/components/dialogs/new-simulator.js +++ b/src/simulator/new-simulator.js @@ -22,7 +22,7 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; class NewSimulatorDialog extends React.Component { valid = false; diff --git a/src/containers/select-simulator.js b/src/simulator/select-simulator.js similarity index 93% rename from src/containers/select-simulator.js rename to src/simulator/select-simulator.js index 4b69ff1..2061adf 100644 --- a/src/containers/select-simulator.js +++ b/src/simulator/select-simulator.js @@ -24,7 +24,7 @@ import { Container } from 'flux/utils'; import { FormGroup, FormControl, FormLabel, Col } from 'react-bootstrap'; import _ from 'lodash'; -import SimulatorStore from '../stores/simulator-store'; +import SimulatorStore from './simulator-store'; class SelectSimulator extends React.Component { static getStores() { @@ -67,7 +67,7 @@ class SelectSimulator extends React.Component { } render() { - const simulatorOptions = this.state.simulators.map(s => + const simulatorOptions = this.state.simulators.map(s => ); @@ -85,5 +85,5 @@ class SelectSimulator extends React.Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(SelectSimulator)); diff --git a/src/components/simulator-action.js b/src/simulator/simulator-action.js similarity index 100% rename from src/components/simulator-action.js rename to src/simulator/simulator-action.js diff --git a/src/data-managers/simulator-data-data-manager.js b/src/simulator/simulator-data-data-manager.js similarity index 97% rename from src/data-managers/simulator-data-data-manager.js rename to src/simulator/simulator-data-data-manager.js index 3154115..94e31a0 100644 --- a/src/data-managers/simulator-data-data-manager.js +++ b/src/simulator/simulator-data-data-manager.js @@ -19,8 +19,8 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import WebsocketAPI from '../api/websocket-api'; -import AppDispatcher from '../app-dispatcher'; +import WebsocketAPI from '../common/api/websocket-api'; +import AppDispatcher from '../common/app-dispatcher'; const OFFSET_TYPE = 2; const OFFSET_VERSION = 4; diff --git a/src/stores/simulator-data-store.js b/src/simulator/simulator-data-store.js similarity index 96% rename from src/stores/simulator-data-store.js rename to src/simulator/simulator-data-store.js index 1c4c8bf..bb84442 100644 --- a/src/stores/simulator-data-store.js +++ b/src/simulator/simulator-data-store.js @@ -21,8 +21,8 @@ import { ReduceStore } from 'flux/utils'; -import AppDispatcher from '../app-dispatcher'; -import SimulatorDataDataManager from '../data-managers/simulator-data-data-manager'; +import AppDispatcher from '../common/app-dispatcher'; +import SimulatorDataDataManager from './simulator-data-data-manager'; const MAX_VALUES = 10000; diff --git a/src/stores/simulator-store.js b/src/simulator/simulator-store.js similarity index 92% rename from src/stores/simulator-store.js rename to src/simulator/simulator-store.js index 03ecf73..7b51818 100644 --- a/src/stores/simulator-store.js +++ b/src/simulator/simulator-store.js @@ -21,9 +21,9 @@ import _ from 'lodash'; -import ArrayStore from './array-store'; -import SimulatorsDataManager from '../data-managers/simulators-data-manager'; -import SimulatorDataDataManager from '../data-managers/simulator-data-data-manager'; +import ArrayStore from '../common/array-store'; +import SimulatorsDataManager from './simulators-data-manager'; +import SimulatorDataDataManager from './simulator-data-data-manager'; class SimulatorStore extends ArrayStore { constructor() { diff --git a/src/data-managers/simulators-data-manager.js b/src/simulator/simulators-data-manager.js similarity index 89% rename from src/data-managers/simulators-data-manager.js rename to src/simulator/simulators-data-manager.js index 4c34f51..df08f95 100644 --- a/src/data-managers/simulators-data-manager.js +++ b/src/simulator/simulators-data-manager.js @@ -19,9 +19,9 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import RestDataManager from './rest-data-manager'; -import RestAPI from '../api/rest-api'; -import AppDispatcher from '../app-dispatcher'; +import RestDataManager from '../common/data-managers/rest-data-manager'; +import RestAPI from '../common/api/rest-api'; +import AppDispatcher from '../common/app-dispatcher'; class SimulatorsDataManager extends RestDataManager { constructor() { diff --git a/src/containers/simulators.js b/src/simulator/simulators.js similarity index 93% rename from src/containers/simulators.js rename to src/simulator/simulators.js index c44567f..d0d8e4f 100644 --- a/src/containers/simulators.js +++ b/src/simulator/simulators.js @@ -25,19 +25,19 @@ import { Button } from 'react-bootstrap'; import FileSaver from 'file-saver'; import _ from 'lodash'; -import AppDispatcher from '../app-dispatcher'; -import SimulatorStore from '../stores/simulator-store'; -import UserStore from '../stores/user-store'; +import AppDispatcher from '../common/app-dispatcher'; +import SimulatorStore from './simulator-store'; +import UserStore from '../user/user-store'; -import Icon from '../components/icon'; -import Table from '../components/table'; -import TableColumn from '../components/table-column'; -import NewSimulatorDialog from '../components/dialogs/new-simulator'; -import EditSimulatorDialog from '../components/dialogs/edit-simulator'; -import ImportSimulatorDialog from '../components/dialogs/import-simulator'; +import Icon from '../common/icon'; +import Table from '../common/table'; +import TableColumn from '../common/table-column'; +import NewSimulatorDialog from './new-simulator'; +import EditSimulatorDialog from './edit-simulator'; +import ImportSimulatorDialog from './import-simulator'; -import SimulatorAction from '../components/simulator-action'; -import DeleteDialog from '../components/dialogs/delete-dialog'; +import SimulatorAction from './simulator-action'; +import DeleteDialog from '../common/dialogs/delete-dialog'; class Simulators extends Component { static getStores() { @@ -330,5 +330,5 @@ class Simulators extends Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(Simulators)); diff --git a/src/components/dialogs/edit-user.js b/src/user/edit-user.js similarity index 98% rename from src/components/dialogs/edit-user.js rename to src/user/edit-user.js index 0d901bd..59cafc7 100644 --- a/src/components/dialogs/edit-user.js +++ b/src/user/edit-user.js @@ -22,7 +22,7 @@ import React from 'react'; import {FormGroup, FormControl, FormLabel, Col} from 'react-bootstrap'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; class EditUserDialog extends React.Component { valid: true; diff --git a/src/components/login-form.js b/src/user/login-form.js similarity index 98% rename from src/components/login-form.js rename to src/user/login-form.js index 7747723..a038f38 100644 --- a/src/components/login-form.js +++ b/src/user/login-form.js @@ -22,7 +22,7 @@ import React, { Component } from 'react'; import { Form, Button, FormGroup, FormControl, FormLabel, Col } from 'react-bootstrap'; -import AppDispatcher from '../app-dispatcher'; +import AppDispatcher from '../common/app-dispatcher'; class LoginForm extends Component { constructor(props) { diff --git a/src/containers/login.js b/src/user/login.js similarity index 87% rename from src/containers/login.js rename to src/user/login.js index 93afa80..3f1e3b6 100644 --- a/src/containers/login.js +++ b/src/user/login.js @@ -25,13 +25,13 @@ import { NavbarBrand } from 'react-bootstrap'; import NotificationSystem from 'react-notification-system'; import { Redirect } from 'react-router-dom'; -import LoginForm from '../components/login-form'; -import Header from '../components/header'; -import Footer from '../components/footer'; -import NotificationsDataManager from '../data-managers/notifications-data-manager'; +import LoginForm from './login-form'; +import Header from '../common/header'; +import Footer from '../common/footer'; +import NotificationsDataManager from '../common/data-managers/notifications-data-manager'; -import AppDispatcher from '../app-dispatcher'; -import UserStore from '../stores/user-store'; +import AppDispatcher from '../common/app-dispatcher'; +import UserStore from './user-store'; class Login extends Component { static getStores() { @@ -97,5 +97,5 @@ class Login extends Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(Login)); diff --git a/src/containers/logout.js b/src/user/logout.js similarity index 95% rename from src/containers/logout.js rename to src/user/logout.js index 9fa39ae..2e19b43 100644 --- a/src/containers/logout.js +++ b/src/user/logout.js @@ -22,7 +22,7 @@ import React from 'react'; import { Redirect } from 'react-router-dom'; -import AppDispatcher from '../app-dispatcher'; +import AppDispatcher from '../common/app-dispatcher'; class Logout extends React.Component { componentWillMount() { diff --git a/src/components/dialogs/new-user.js b/src/user/new-user.js similarity index 98% rename from src/components/dialogs/new-user.js rename to src/user/new-user.js index e711596..5919568 100644 --- a/src/components/dialogs/new-user.js +++ b/src/user/new-user.js @@ -22,7 +22,7 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel, FormText, Col } from 'react-bootstrap'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; class NewUserDialog extends React.Component { valid: false; diff --git a/src/stores/user-store.js b/src/user/user-store.js similarity index 91% rename from src/stores/user-store.js rename to src/user/user-store.js index c3c563f..c925a35 100644 --- a/src/stores/user-store.js +++ b/src/user/user-store.js @@ -21,9 +21,9 @@ import { ReduceStore } from 'flux/utils'; -import AppDispatcher from '../app-dispatcher'; -import UsersDataManager from '../data-managers/users-data-manager'; -import SimulatorDataDataManager from '../data-managers/simulator-data-data-manager'; +import AppDispatcher from '../common/app-dispatcher'; +import UsersDataManager from './users-data-manager'; +import SimulatorDataDataManager from '../simulator/simulator-data-data-manager'; class UserStore extends ReduceStore { constructor() { @@ -73,7 +73,7 @@ class UserStore extends ReduceStore { state = Object.assign({}, state, { loginMessage: 'Wrong credentials! Please try again.' }); } - return state; + return state; default: return state; diff --git a/src/data-managers/users-data-manager.js b/src/user/users-data-manager.js similarity index 91% rename from src/data-managers/users-data-manager.js rename to src/user/users-data-manager.js index 692b18b..6ce0c7a 100644 --- a/src/data-managers/users-data-manager.js +++ b/src/user/users-data-manager.js @@ -19,9 +19,9 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import RestDataManager from './rest-data-manager'; -import RestAPI from '../api/rest-api'; -import AppDispatcher from '../app-dispatcher'; +import RestDataManager from '../common/data-managers/rest-data-manager'; +import RestAPI from '../common/api/rest-api'; +import AppDispatcher from '../common/app-dispatcher'; class UsersDataManager extends RestDataManager { constructor() { @@ -57,7 +57,7 @@ class UsersDataManager extends RestDataManager { }); }); } - + } export default new UsersDataManager(); diff --git a/src/stores/users-store.js b/src/user/users-store.js similarity index 91% rename from src/stores/users-store.js rename to src/user/users-store.js index e42b1ed..44622ba 100644 --- a/src/stores/users-store.js +++ b/src/user/users-store.js @@ -19,9 +19,9 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import ArrayStore from './array-store'; -import UsersDataManager from '../data-managers/users-data-manager'; -import NotificationsDataManager from '../data-managers/notifications-data-manager'; +import ArrayStore from '../common/array-store'; +import UsersDataManager from './users-data-manager'; +import NotificationsDataManager from '../common/data-managers/notifications-data-manager'; class UsersStore extends ArrayStore { constructor() { diff --git a/src/containers/users.js b/src/user/users.js similarity index 88% rename from src/containers/users.js rename to src/user/users.js index b61e16c..304412f 100644 --- a/src/containers/users.js +++ b/src/user/users.js @@ -23,17 +23,17 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; import { Button } from 'react-bootstrap'; -import AppDispatcher from '../app-dispatcher'; -import UserStore from '../stores/user-store'; -import UsersStore from '../stores/users-store'; +import AppDispatcher from '../common/app-dispatcher'; +import UserStore from './user-store'; +import UsersStore from './users-store'; -import Icon from '../components/icon'; -import Table from '../components/table'; -import TableColumn from '../components/table-column'; -import NewUserDialog from '../components/dialogs/new-user'; -import EditUserDialog from '../components/dialogs/edit-user'; +import Icon from '../common/icon'; +import Table from '../common/table'; +import TableColumn from '../common/table-column'; +import NewUserDialog from './new-user'; +import EditUserDialog from './edit-user'; -import DeleteDialog from '../components/dialogs/delete-dialog'; +import DeleteDialog from '../common/dialogs/delete-dialog'; class Users extends Component { static getStores() { @@ -140,5 +140,5 @@ class Users extends Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(Users)); diff --git a/src/components/dropzone.js b/src/visualization/dropzone.js similarity index 100% rename from src/components/dropzone.js rename to src/visualization/dropzone.js diff --git a/src/components/dialogs/edit-visualization.js b/src/visualization/edit-visualization.js similarity index 98% rename from src/components/dialogs/edit-visualization.js rename to src/visualization/edit-visualization.js index 565e141..c8514c8 100644 --- a/src/components/dialogs/edit-visualization.js +++ b/src/visualization/edit-visualization.js @@ -22,7 +22,7 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; class EditVisualizationDialog extends React.Component { valid: false; diff --git a/src/components/grid.js b/src/visualization/grid.js similarity index 100% rename from src/components/grid.js rename to src/visualization/grid.js diff --git a/src/components/dialogs/import-visualization.js b/src/visualization/import-visualization.js similarity index 98% rename from src/components/dialogs/import-visualization.js rename to src/visualization/import-visualization.js index 22188f2..a833d70 100644 --- a/src/components/dialogs/import-visualization.js +++ b/src/visualization/import-visualization.js @@ -22,7 +22,7 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; class ImportVisualizationDialog extends React.Component { valid = false; diff --git a/src/components/dialogs/new-visualization.js b/src/visualization/new-visualization.js similarity index 98% rename from src/components/dialogs/new-visualization.js rename to src/visualization/new-visualization.js index 2427340..5618c14 100644 --- a/src/components/dialogs/new-visualization.js +++ b/src/visualization/new-visualization.js @@ -22,7 +22,7 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; class NewVisualzationDialog extends React.Component { valid: false; diff --git a/src/components/toolbox-item.js b/src/visualization/toolbox-item.js similarity index 98% rename from src/components/toolbox-item.js rename to src/visualization/toolbox-item.js index a4f5b14..be498f4 100644 --- a/src/components/toolbox-item.js +++ b/src/visualization/toolbox-item.js @@ -22,7 +22,7 @@ import React from 'react'; import { DragSource } from 'react-dnd'; import classNames from 'classnames'; -import Icon from './icon'; +import Icon from '../common/icon'; const toolboxItemSource = { beginDrag(props) { diff --git a/src/stores/visualization-store.js b/src/visualization/visualization-store.js similarity index 88% rename from src/stores/visualization-store.js rename to src/visualization/visualization-store.js index ba69682..adadd2d 100644 --- a/src/stores/visualization-store.js +++ b/src/visualization/visualization-store.js @@ -19,7 +19,7 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import ArrayStore from './array-store'; -import VisualizationsDataManager from '../data-managers/visualizations-data-manager'; +import ArrayStore from '../common/array-store'; +import VisualizationsDataManager from './visualizations-data-manager'; export default new ArrayStore('visualizations', VisualizationsDataManager); diff --git a/src/containers/visualization.js b/src/visualization/visualization.js similarity index 95% rename from src/containers/visualization.js rename to src/visualization/visualization.js index 36fac12..59ffbc1 100644 --- a/src/containers/visualization.js +++ b/src/visualization/visualization.js @@ -27,23 +27,23 @@ import Fullscreenable from 'react-fullscreenable'; import Slider from 'rc-slider'; import classNames from 'classnames'; -import Icon from '../components/icon'; -import WidgetFactory from '../components/widget-factory'; -import ToolboxItem from '../components/toolbox-item'; -import Dropzone from '../components/dropzone'; -import Widget from './widget'; -import EditWidget from '../components/dialogs/edit-widget'; -import Grid from '../components/grid'; +import Icon from '../common/icon'; +import WidgetFactory from '../widget/widget-factory'; +import ToolboxItem from './toolbox-item'; +import Dropzone from './dropzone'; +import Widget from '../widget/widget'; +import EditWidget from '../widget/edit-widget'; +import Grid from './grid'; -import UserStore from '../stores/user-store'; -import VisualizationStore from '../stores/visualization-store'; -import ProjectStore from '../stores/project-store'; -import SimulationStore from '../stores/simulation-store'; -import SimulationModelStore from '../stores/simulation-model-store'; -import FileStore from '../stores/file-store'; -import AppDispatcher from '../app-dispatcher'; -import NotificationsDataManager from '../data-managers/notifications-data-manager'; -import NotificationsFactory from '../data-managers/notifications-factory'; +import UserStore from '../user/user-store'; +import VisualizationStore from './visualization-store'; +import ProjectStore from '../project/project-store'; +import SimulationStore from '../simulation/simulation-store'; +import SimulationModelStore from '../simulationmodel/simulation-model-store'; +import FileStore from '../file/file-store'; +import AppDispatcher from '../common/app-dispatcher'; +import NotificationsDataManager from '../common/data-managers/notifications-data-manager'; +import NotificationsFactory from '../common/data-managers/notifications-factory'; import 'react-contexify/dist/ReactContexify.min.css'; @@ -547,5 +547,5 @@ class Visualization extends React.Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Fullscreenable()(Container.create(fluxContainerConverter.convert(Visualization), { withProps: true })); diff --git a/src/data-managers/visualizations-data-manager.js b/src/visualization/visualizations-data-manager.js similarity index 92% rename from src/data-managers/visualizations-data-manager.js rename to src/visualization/visualizations-data-manager.js index b141880..ee12b3e 100644 --- a/src/data-managers/visualizations-data-manager.js +++ b/src/visualization/visualizations-data-manager.js @@ -19,6 +19,6 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import RestDataManager from './rest-data-manager'; +import RestDataManager from '../common/data-managers/rest-data-manager'; export default new RestDataManager('visualization', '/visualizations'); diff --git a/src/components/dialogs/edit-widget-aspect-control.js b/src/widget/edit-widget-aspect-control.js similarity index 100% rename from src/components/dialogs/edit-widget-aspect-control.js rename to src/widget/edit-widget-aspect-control.js diff --git a/src/components/dialogs/edit-widget-checkbox-control.js b/src/widget/edit-widget-checkbox-control.js similarity index 100% rename from src/components/dialogs/edit-widget-checkbox-control.js rename to src/widget/edit-widget-checkbox-control.js diff --git a/src/components/dialogs/edit-widget-color-control.js b/src/widget/edit-widget-color-control.js similarity index 100% rename from src/components/dialogs/edit-widget-color-control.js rename to src/widget/edit-widget-color-control.js diff --git a/src/components/dialogs/edit-widget-color-zones-control.js b/src/widget/edit-widget-color-zones-control.js similarity index 96% rename from src/components/dialogs/edit-widget-color-zones-control.js rename to src/widget/edit-widget-color-zones-control.js index 3fd97d4..c124353 100644 --- a/src/components/dialogs/edit-widget-color-zones-control.js +++ b/src/widget/edit-widget-color-zones-control.js @@ -23,9 +23,9 @@ import React from 'react'; import { FormGroup, FormLabel, Button } from 'react-bootstrap'; -import Icon from '../icon'; -import Table from '../table'; -import TableColumn from '../table-column'; +import Icon from '../common/icon'; +import Table from '../common/table'; +import TableColumn from '../common/table-column'; class EditWidgetColorZonesControl extends React.Component { constructor(props) { diff --git a/src/components/dialogs/edit-widget-control-creator.js b/src/widget/edit-widget-control-creator.js similarity index 100% rename from src/components/dialogs/edit-widget-control-creator.js rename to src/widget/edit-widget-control-creator.js diff --git a/src/components/dialogs/edit-widget-html-content.js b/src/widget/edit-widget-html-content.js similarity index 100% rename from src/components/dialogs/edit-widget-html-content.js rename to src/widget/edit-widget-html-content.js diff --git a/src/components/dialogs/edit-widget-image-control.js b/src/widget/edit-widget-image-control.js similarity index 98% rename from src/components/dialogs/edit-widget-image-control.js rename to src/widget/edit-widget-image-control.js index 5973a45..e9d0118 100644 --- a/src/components/dialogs/edit-widget-image-control.js +++ b/src/widget/edit-widget-image-control.js @@ -22,7 +22,7 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel, Button, ProgressBar } from 'react-bootstrap'; -import AppDispatcher from '../../app-dispatcher'; +import AppDispatcher from '../common/app-dispatcher'; class EditImageWidgetControl extends React.Component { constructor(props) { @@ -50,7 +50,7 @@ class EditImageWidgetControl extends React.Component { formData.append(key, this.state.fileList[key]); } } - + // upload files AppDispatcher.dispatch({ type: 'files/start-upload', diff --git a/src/components/dialogs/edit-widget-min-max-control.js b/src/widget/edit-widget-min-max-control.js similarity index 100% rename from src/components/dialogs/edit-widget-min-max-control.js rename to src/widget/edit-widget-min-max-control.js diff --git a/src/components/dialogs/edit-widget-number-control.js b/src/widget/edit-widget-number-control.js similarity index 100% rename from src/components/dialogs/edit-widget-number-control.js rename to src/widget/edit-widget-number-control.js diff --git a/src/components/dialogs/edit-widget-orientation.js b/src/widget/edit-widget-orientation.js similarity index 98% rename from src/components/dialogs/edit-widget-orientation.js rename to src/widget/edit-widget-orientation.js index 73f8830..88ee57c 100644 --- a/src/components/dialogs/edit-widget-orientation.js +++ b/src/widget/edit-widget-orientation.js @@ -22,7 +22,7 @@ import React, { Component } from 'react'; import { FormGroup, Col, Row, FormCheck, FormLabel } from 'react-bootstrap'; -import WidgetSlider from '../widgets/slider'; +import WidgetSlider from './widgets/slider'; class EditWidgetOrientation extends Component { constructor(props) { diff --git a/src/components/dialogs/edit-widget-parameters-control.js b/src/widget/edit-widget-parameters-control.js similarity index 96% rename from src/components/dialogs/edit-widget-parameters-control.js rename to src/widget/edit-widget-parameters-control.js index 0fd5695..1831a5c 100644 --- a/src/components/dialogs/edit-widget-parameters-control.js +++ b/src/widget/edit-widget-parameters-control.js @@ -21,7 +21,7 @@ import React, { Component } from 'react'; import { FormGroup, FormLabel } from 'react-bootstrap'; -import ParametersEditor from '../parameters-editor'; +import ParametersEditor from '../common/parameters-editor'; class EditWidgetParametersControl extends Component { constructor(props) { diff --git a/src/components/dialogs/edit-widget-signal-control.js b/src/widget/edit-widget-signal-control.js similarity index 100% rename from src/components/dialogs/edit-widget-signal-control.js rename to src/widget/edit-widget-signal-control.js diff --git a/src/components/dialogs/edit-widget-signals-control.js b/src/widget/edit-widget-signals-control.js similarity index 100% rename from src/components/dialogs/edit-widget-signals-control.js rename to src/widget/edit-widget-signals-control.js diff --git a/src/components/dialogs/edit-widget-simulation-control.js b/src/widget/edit-widget-simulation-control.js similarity index 100% rename from src/components/dialogs/edit-widget-simulation-control.js rename to src/widget/edit-widget-simulation-control.js diff --git a/src/components/dialogs/edit-widget-text-control.js b/src/widget/edit-widget-text-control.js similarity index 100% rename from src/components/dialogs/edit-widget-text-control.js rename to src/widget/edit-widget-text-control.js diff --git a/src/components/dialogs/edit-widget-text-size-control.js b/src/widget/edit-widget-text-size-control.js similarity index 100% rename from src/components/dialogs/edit-widget-text-size-control.js rename to src/widget/edit-widget-text-size-control.js diff --git a/src/components/dialogs/edit-widget-time-control.js b/src/widget/edit-widget-time-control.js similarity index 100% rename from src/components/dialogs/edit-widget-time-control.js rename to src/widget/edit-widget-time-control.js diff --git a/src/components/dialogs/edit-widget.js b/src/widget/edit-widget.js similarity index 98% rename from src/components/dialogs/edit-widget.js rename to src/widget/edit-widget.js index fd5debd..051feae 100644 --- a/src/components/dialogs/edit-widget.js +++ b/src/widget/edit-widget.js @@ -22,7 +22,7 @@ import React from 'react'; //import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; import createControls from './edit-widget-control-creator'; @@ -58,7 +58,7 @@ class EditWidgetDialog extends React.Component { // scale width to match aspect const aspectRatio = file.dimensions.width / file.dimensions.height; changeObject.width = this.state.temporal.height * aspectRatio; - + return changeObject; } diff --git a/src/components/widget-factory.js b/src/widget/widget-factory.js similarity index 100% rename from src/components/widget-factory.js rename to src/widget/widget-factory.js diff --git a/src/components/widget-plot/plot-legend.js b/src/widget/widget-plot/plot-legend.js similarity index 100% rename from src/components/widget-plot/plot-legend.js rename to src/widget/widget-plot/plot-legend.js diff --git a/src/components/widget-plot/plot.js b/src/widget/widget-plot/plot.js similarity index 100% rename from src/components/widget-plot/plot.js rename to src/widget/widget-plot/plot.js diff --git a/src/containers/widget.js b/src/widget/widget.js similarity index 88% rename from src/containers/widget.js rename to src/widget/widget.js index 3a6a715..cb9944e 100644 --- a/src/containers/widget.js +++ b/src/widget/widget.js @@ -25,28 +25,28 @@ import { ContextMenuProvider } from 'react-contexify'; import { Rnd } from 'react-rnd'; import classNames from 'classnames'; -import AppDispatcher from '../app-dispatcher'; -import UserStore from '../stores/user-store'; -import SimulatorDataStore from '../stores/simulator-data-store'; -import SimulationModelStore from '../stores/simulation-model-store'; -import FileStore from '../stores/file-store'; +import AppDispatcher from '../common/app-dispatcher'; +import UserStore from '../user/user-store'; +import SimulatorDataStore from '../simulator/simulator-data-store'; +import SimulationModelStore from '../simulationmodel/simulation-model-store'; +import FileStore from '../file/file-store'; -import WidgetCustomAction from '../components/widgets/custom-action'; -import WidgetAction from '../components/widgets/action'; -import WidgetLamp from '../components/widgets/lamp'; -import WidgetValue from '../components/widgets/value'; -import WidgetPlot from '../components/widgets/plot'; -import WidgetTable from '../components/widgets/table'; -import WidgetLabel from '../components/widgets/label'; -import WidgetPlotTable from '../components/widgets/plot-table'; -import WidgetImage from '../components/widgets/image'; -import WidgetButton from '../components/widgets/button'; -import WidgetInput from '../components/widgets/input'; -import WidgetSlider from '../components/widgets/slider'; -import WidgetGauge from '../components/widgets/gauge'; -import WidgetBox from '../components/widgets/box'; -import WidgetHTML from '../components/widgets/html'; -import WidgetTopology from '../components/widgets/topology'; +import WidgetCustomAction from './widgets/custom-action'; +import WidgetAction from './widgets/action'; +import WidgetLamp from './widgets/lamp'; +import WidgetValue from './widgets/value'; +import WidgetPlot from './widgets/plot'; +import WidgetTable from './widgets/table'; +import WidgetLabel from './widgets/label'; +import WidgetPlotTable from './widgets/plot-table'; +import WidgetImage from './widgets/image'; +import WidgetButton from './widgets/button'; +import WidgetInput from './widgets/input'; +import WidgetSlider from './widgets/slider'; +import WidgetGauge from './widgets/gauge'; +import WidgetBox from './widgets/box'; +import WidgetHTML from './widgets/html'; +import WidgetTopology from './widgets/topology'; import '../styles/widgets.css'; @@ -294,5 +294,5 @@ class Widget extends React.Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(Widget), { withProps: true }); diff --git a/src/components/widgets/action.js b/src/widget/widgets/action.js similarity index 97% rename from src/components/widgets/action.js rename to src/widget/widgets/action.js index 24e105c..0d309a8 100644 --- a/src/components/widgets/action.js +++ b/src/widget/widgets/action.js @@ -22,7 +22,7 @@ import React, { Component } from 'react'; import { Button, ButtonGroup } from 'react-bootstrap'; -import Icon from '../icon'; +import Icon from '../../common/icon'; class WidgetAction extends Component { constructor(props) { diff --git a/src/components/widgets/box.js b/src/widget/widgets/box.js similarity index 95% rename from src/components/widgets/box.js rename to src/widget/widgets/box.js index c32517f..69539ab 100644 --- a/src/components/widgets/box.js +++ b/src/widget/widgets/box.js @@ -22,7 +22,7 @@ import React, { Component } from 'react'; -import EditWidgetColorControl from '../dialogs/edit-widget-color-control'; +import EditWidgetColorControl from '../edit-widget-color-control'; class WidgetBox extends Component { render() { diff --git a/src/components/widgets/button.js b/src/widget/widgets/button.js similarity index 100% rename from src/components/widgets/button.js rename to src/widget/widgets/button.js diff --git a/src/components/widgets/custom-action.js b/src/widget/widgets/custom-action.js similarity index 90% rename from src/components/widgets/custom-action.js rename to src/widget/widgets/custom-action.js index 4a1a7cb..6571c8f 100644 --- a/src/components/widgets/custom-action.js +++ b/src/widget/widgets/custom-action.js @@ -22,10 +22,10 @@ import React, { Component } from 'react'; import { Button } from 'react-bootstrap'; -import Icon from '../icon'; -import UserStore from '../../stores/user-store'; -import SimulatorStore from '../../stores/simulator-store'; -import AppDispatcher from '../../app-dispatcher'; +import Icon from '../../common/icon'; +import UserStore from '../../user/user-store'; +import SimulatorStore from '../../simulator/simulator-store'; +import AppDispatcher from '../../common/app-dispatcher'; class WidgetCustomAction extends Component { constructor(props) { diff --git a/src/components/widgets/gauge.js b/src/widget/widgets/gauge.js similarity index 100% rename from src/components/widgets/gauge.js rename to src/widget/widgets/gauge.js diff --git a/src/components/widgets/html.js b/src/widget/widgets/html.js similarity index 100% rename from src/components/widgets/html.js rename to src/widget/widgets/html.js diff --git a/src/components/widgets/image.js b/src/widget/widgets/image.js similarity index 97% rename from src/components/widgets/image.js rename to src/widget/widgets/image.js index 3438a51..1b73f2a 100644 --- a/src/components/widgets/image.js +++ b/src/widget/widgets/image.js @@ -21,7 +21,7 @@ import React from 'react'; -import AppDispatcher from '../../app-dispatcher'; +import AppDispatcher from '../../common/app-dispatcher'; import config from '../../config'; class WidgetImage extends React.Component { diff --git a/src/components/widgets/input.js b/src/widget/widgets/input.js similarity index 100% rename from src/components/widgets/input.js rename to src/widget/widgets/input.js diff --git a/src/components/widgets/label.js b/src/widget/widgets/label.js similarity index 94% rename from src/components/widgets/label.js rename to src/widget/widgets/label.js index 4ce680e..f53eb18 100644 --- a/src/components/widgets/label.js +++ b/src/widget/widgets/label.js @@ -21,7 +21,7 @@ import React, { Component } from 'react'; -import EditWidgetColorControl from '../dialogs/edit-widget-color-control'; +import EditWidgetColorControl from '../edit-widget-color-control'; class WidgetLabel extends Component { render() { diff --git a/src/components/widgets/lamp.js b/src/widget/widgets/lamp.js similarity index 96% rename from src/components/widgets/lamp.js rename to src/widget/widgets/lamp.js index 5b90f56..0514047 100644 --- a/src/components/widgets/lamp.js +++ b/src/widget/widgets/lamp.js @@ -21,7 +21,7 @@ import React, { Component } from 'react'; -import EditWidgetColorControl from '../dialogs/edit-widget-color-control'; +import EditWidgetColorControl from '../edit-widget-color-control'; class WidgetLamp extends Component { constructor(props) { diff --git a/src/components/widgets/plot-table.js b/src/widget/widgets/plot-table.js similarity index 100% rename from src/components/widgets/plot-table.js rename to src/widget/widgets/plot-table.js diff --git a/src/components/widgets/plot.js b/src/widget/widgets/plot.js similarity index 100% rename from src/components/widgets/plot.js rename to src/widget/widgets/plot.js diff --git a/src/components/widgets/slider.js b/src/widget/widgets/slider.js similarity index 100% rename from src/components/widgets/slider.js rename to src/widget/widgets/slider.js diff --git a/src/components/widgets/table.js b/src/widget/widgets/table.js similarity index 96% rename from src/components/widgets/table.js rename to src/widget/widgets/table.js index 53af120..9ac2d0e 100644 --- a/src/components/widgets/table.js +++ b/src/widget/widgets/table.js @@ -22,8 +22,8 @@ import React, { Component } from 'react'; import { format } from 'd3'; -import Table from '../table'; -import TableColumn from '../table-column'; +import Table from '../../common/table'; +import TableColumn from '../../common/table-column'; class WidgetTable extends Component { constructor(props) { diff --git a/src/components/widgets/topology.js b/src/widget/widgets/topology.js similarity index 100% rename from src/components/widgets/topology.js rename to src/widget/widgets/topology.js diff --git a/src/components/widgets/value.js b/src/widget/widgets/value.js similarity index 100% rename from src/components/widgets/value.js rename to src/widget/widgets/value.js From d1b5e416e2334ce9cc00544e33feea53c3fc7cba Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 20 Aug 2019 14:49:57 +0200 Subject: [PATCH 21/34] fix a path in testing file --- .../widget/edit-widget-control-creator.js | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/__tests__/widget/edit-widget-control-creator.js b/src/__tests__/widget/edit-widget-control-creator.js index df9ce22..fb5cfab 100644 --- a/src/__tests__/widget/edit-widget-control-creator.js +++ b/src/__tests__/widget/edit-widget-control-creator.js @@ -1,22 +1,22 @@ import { expect } from 'chai'; -import createControls from '../widget/edit-widget-control-creator'; -import EditWidgetTextControl from '../widget/edit-widget-text-control'; -import EditWidgetColorControl from '../widget/edit-widget-color-control'; -import EditWidgetTimeControl from '../widget/edit-widget-time-control'; -import EditImageWidgetControl from '../widget/edit-widget-image-control'; -import EditWidgetSimulationControl from '../widget/edit-widget-simulation-control'; -import EditWidgetSignalControl from '../widget/edit-widget-signal-control'; -import EditWidgetSignalsControl from '../widget/edit-widget-signals-control'; -import EditWidgetOrientation from '../widget/edit-widget-orientation'; -import EditWidgetTextSizeControl from '../widget/edit-widget-text-size-control'; -import EditWidgetAspectControl from '../widget/edit-widget-aspect-control'; -import EditWidgetCheckboxControl from '../widget/edit-widget-checkbox-control'; -import EditWidgetMinMaxControl from '../widget/edit-widget-min-max-control'; -import EditWidgetColorZonesControl from '../widget/edit-widget-color-zones-control'; -import EditWidgetHTMLContent from '../widget/edit-widget-html-content'; -import EditWidgetNumberControl from '../widget/edit-widget-number-control'; +import createControls from '../../widget/edit-widget-control-creator'; +import EditWidgetTextControl from '../../widget/edit-widget-text-control'; +import EditWidgetColorControl from '../../widget/edit-widget-color-control'; +import EditWidgetTimeControl from '../../widget/edit-widget-time-control'; +import EditImageWidgetControl from '../../widget/edit-widget-image-control'; +import EditWidgetSimulationControl from '../../widget/edit-widget-simulation-control'; +import EditWidgetSignalControl from '../../widget/edit-widget-signal-control'; +import EditWidgetSignalsControl from '../../widget/edit-widget-signals-control'; +import EditWidgetOrientation from '../../widget/edit-widget-orientation'; +import EditWidgetTextSizeControl from '../../widget/edit-widget-text-size-control'; +import EditWidgetAspectControl from '../../widget/edit-widget-aspect-control'; +import EditWidgetCheckboxControl from '../../widget/edit-widget-checkbox-control'; +import EditWidgetMinMaxControl from '../../widget/edit-widget-min-max-control'; +import EditWidgetColorZonesControl from '../../widget/edit-widget-color-zones-control'; +import EditWidgetHTMLContent from '../../widget/edit-widget-html-content'; +import EditWidgetNumberControl from '../../widget/edit-widget-number-control'; describe('edit widget control creator', () => { it('should not return null', () => { From ae2314312a60cfbb3648cd9dfa27be1deec1eb46 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 20 Aug 2019 16:40:51 +0200 Subject: [PATCH 22/34] WIP, Add some TODOs in new scenario container, backend responses of scenarios endpoint require adaptions for frontend compatibility --- src/scenario/scenarios-data-manager.js | 2 +- src/scenario/scenarios.js | 35 +++++++++++++++++++++++--- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/scenario/scenarios-data-manager.js b/src/scenario/scenarios-data-manager.js index 3ab824a..a56a61e 100644 --- a/src/scenario/scenarios-data-manager.js +++ b/src/scenario/scenarios-data-manager.js @@ -25,7 +25,7 @@ import AppDispatcher from "../common/app-dispatcher"; class ScenariosDataManager extends RestDataManager { constructor() { - super('scenario', '/scenarios'); + super('scenario', '/scenarios', ['id', 'name', 'running', 'simulationModelIDs', 'userIDs', 'dashboardIDs', 'startParameters' ]); } getSimulationModels(token, id) { diff --git a/src/scenario/scenarios.js b/src/scenario/scenarios.js index 864e552..9c8c59c 100644 --- a/src/scenario/scenarios.js +++ b/src/scenario/scenarios.js @@ -49,6 +49,7 @@ class Scenarios extends Component { const scenarios = ScenarioStore.getState(); const simulationModels = SimulationModelStore.getState(); const simulators = SimulatorStore.getState(); + const dashboards = []; // TODO get dashboards with DashboadStore.getState() here const sessionToken = UserStore.getState().token; @@ -56,6 +57,7 @@ class Scenarios extends Component { scenarios, simulationModels, simulators, + dashboards, sessionToken, newModal: false, @@ -78,9 +80,13 @@ class Scenarios extends Component { componentDidUpdate() { const simulationModelIds = []; const simulatorIds = []; + const dashboardIds = []; + for (let scenario of this.state.scenarios) { - for (let modelId of scenario.simulationModels) { + // collect missing simulationModels + // TODO response of backend has to contain simulationModelIDs and dashboardIDs per scenario + for (let modelId of scenario.simulationModelIDs) { const model = this.state.simulationModels.find(m => m != null && m.id === modelId); if (model == null) { @@ -89,12 +95,23 @@ class Scenarios extends Component { continue; } - if (this.state.simulators.includes(s => s._id === model.simulator) === false) { - simulatorIds.push(model.simulator); + // collect missing simulators + if (this.state.simulators.includes(s => s.id === model.simulatorID) === false) { + simulatorIds.push(model.simulatorID); + } + } + + // collect missing dashboards + for (let dashboardId of scenario.dashboardIDs) { + const dashboard = this.state.dashboards.find(d => d != null && d.id === dashboardId); + + if (dashboard == null) { + dashboardIds.push(dashboardId); } } } + // load missing simulationModels if (simulationModelIds.length > 0) { AppDispatcher.dispatch({ type: 'simulationModels/start-load', @@ -103,6 +120,7 @@ class Scenarios extends Component { }); } + // load missing simulators if (simulatorIds.length > 0) { AppDispatcher.dispatch({ type: 'simulators/start-load', @@ -110,6 +128,15 @@ class Scenarios extends Component { token: this.state.sessionToken }); } + + // load missing dashboards + if (dashboardIds.length > 0) { + AppDispatcher.dispatch( { + type: 'dashboards/start-load', + data: dashboardIds, + token: this.state.sessionToken + }) + } } closeNewModal(data) { @@ -270,7 +297,7 @@ class Scenarios extends Component { }); } } - } + }; render() { const buttonStyle = { From b8f8294a8b9f0c457c943223cf2eb106f44c4f7d Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 17 Sep 2019 15:33:15 +0200 Subject: [PATCH 23/34] clean up view that lists all scenarios --- src/scenario/edit-scenario.js | 10 ++- src/scenario/scenarios.js | 164 +++------------------------------- 2 files changed, 16 insertions(+), 158 deletions(-) diff --git a/src/scenario/edit-scenario.js b/src/scenario/edit-scenario.js index 4cebf47..6d22d07 100644 --- a/src/scenario/edit-scenario.js +++ b/src/scenario/edit-scenario.js @@ -34,6 +34,7 @@ class EditScenarioDialog extends React.Component { this.state = { name: '', id: '', + running: false, startParameters: {} }; } @@ -69,25 +70,26 @@ class EditScenarioDialog extends React.Component { this.setState({ name: this.props.scenario.name, id: this.props.scenario.id, + running: this.props.scenario.running, startParameters: this.props.scenario.startParameters || {} }); - } + }; handleStartParametersChange = startParameters => { this.setState({ startParameters }); - } + }; render() { return
    - Name + Name - Start Parameters + Start Parameters diff --git a/src/scenario/scenarios.js b/src/scenario/scenarios.js index 9c8c59c..ab6e173 100644 --- a/src/scenario/scenarios.js +++ b/src/scenario/scenarios.js @@ -27,8 +27,6 @@ import FileSaver from 'file-saver'; import AppDispatcher from '../common/app-dispatcher'; import ScenarioStore from './scenario-store'; import UserStore from '../user/user-store'; -import SimulatorStore from '../simulator/simulator-store'; -import SimulationModelStore from '../simulationmodel/simulation-model-store'; import Icon from '../common/icon'; import Table from '../common/table'; @@ -37,27 +35,19 @@ import NewScenarioDialog from './new-scenario'; import EditScenarioDialog from './edit-scenario'; import ImportScenarioDialog from './import-scenario'; -import SimulatorAction from '../simulator/simulator-action'; import DeleteDialog from '../common/dialogs/delete-dialog'; class Scenarios extends Component { static getStores() { - return [ ScenarioStore, UserStore, SimulatorStore, SimulationModelStore ]; + return [ ScenarioStore, UserStore ]; } static calculateState() { const scenarios = ScenarioStore.getState(); - const simulationModels = SimulationModelStore.getState(); - const simulators = SimulatorStore.getState(); - const dashboards = []; // TODO get dashboards with DashboadStore.getState() here - const sessionToken = UserStore.getState().token; return { scenarios, - simulationModels, - simulators, - dashboards, sessionToken, newModal: false, @@ -77,67 +67,7 @@ class Scenarios extends Component { }); } - componentDidUpdate() { - const simulationModelIds = []; - const simulatorIds = []; - const dashboardIds = []; - - - for (let scenario of this.state.scenarios) { - // collect missing simulationModels - // TODO response of backend has to contain simulationModelIDs and dashboardIDs per scenario - for (let modelId of scenario.simulationModelIDs) { - const model = this.state.simulationModels.find(m => m != null && m.id === modelId); - - if (model == null) { - simulationModelIds.push(modelId); - - continue; - } - - // collect missing simulators - if (this.state.simulators.includes(s => s.id === model.simulatorID) === false) { - simulatorIds.push(model.simulatorID); - } - } - - // collect missing dashboards - for (let dashboardId of scenario.dashboardIDs) { - const dashboard = this.state.dashboards.find(d => d != null && d.id === dashboardId); - - if (dashboard == null) { - dashboardIds.push(dashboardId); - } - } - } - - // load missing simulationModels - if (simulationModelIds.length > 0) { - AppDispatcher.dispatch({ - type: 'simulationModels/start-load', - data: simulationModelIds, - token: this.state.sessionToken - }); - } - - // load missing simulators - if (simulatorIds.length > 0) { - AppDispatcher.dispatch({ - type: 'simulators/start-load', - data: simulatorIds, - token: this.state.sessionToken - }); - } - - // load missing dashboards - if (dashboardIds.length > 0) { - AppDispatcher.dispatch( { - type: 'dashboards/start-load', - data: dashboardIds, - token: this.state.sessionToken - }) - } - } + componentDidUpdate() {} closeNewModal(data) { this.setState({ newModal : false }); @@ -164,7 +94,7 @@ class Scenarios extends Component { this.setState({ deleteModal: true, modalScenario: deleteScenario }); } - closeDeleteModal = confirmDelete => { + closeDeleteModal(confirmDelete) { this.setState({ deleteModal: false }); if (confirmDelete === false) { @@ -176,7 +106,7 @@ class Scenarios extends Component { data: this.state.modalScenario, token: this.state.sessionToken }); - } + }; showEditModal(id) { // get scenario by id @@ -221,83 +151,20 @@ class Scenarios extends Component { this.confirmDeleteModal(); } - } + }; exportScenario(index) { // filter properties let scenario = Object.assign({}, this.state.scenarios[index]); delete scenario.id; - delete scenario.users; - delete scenario.dashboards; - scenario.simulationModels.forEach(model => { - delete model.simulator; - }); + // TODO request missing scenario parameters (Dashboards and Simulation Modles) recursively for export // show save dialog const blob = new Blob([JSON.stringify(scenario, null, 2)], { type: 'application/json' }); FileSaver.saveAs(blob, 'scenario - ' + scenario.name + '.json'); } - onScenarioChecked(index, event) { - const selectedScenarios = Object.assign([], this.state.selectedScenarios); - for (let key in selectedScenarios) { - if (selectedScenarios[key] === index) { - // update existing entry - if (event.target.checked) { - return; - } - - selectedScenarios.splice(key, 1); - - this.setState({ selectedScenarios }); - return; - } - } - - // add new entry - if (event.target.checked === false) { - return; - } - - selectedScenarios.push(index); - this.setState({ selectedScenarios }); - } - - runAction = action => { - for (let index of this.state.selectedScenarios) { - for (let model of this.state.scenarios[index].simulationModels) { - // get simulation model - const simulationModel = this.state.simulationModels.find(m => m != null && m.id === model); - if (simulationModel == null) { - continue; - } - - // get simulator for model - let simulator = null; - for (let sim of this.state.simulators) { - if (sim.id === simulationModel.simulatorID) { - simulator = sim; - } - } - - if (simulator == null) { - continue; - } - - if (action.data.action === 'start') { - action.data.parameters = Object.assign({}, this.state.scenarios[index].startParameters, simulationModel.startParameters); - } - - AppDispatcher.dispatch({ - type: 'simulators/start-action', - simulator, - data: action.data, - token: this.state.sessionToken - }); - } - } - }; render() { const buttonStyle = { @@ -309,10 +176,11 @@ class Scenarios extends Component {

    Scenarios

    - this.onScenarioChecked(index, event)} width='30' /> + +
    -
    - -
    -
    @@ -345,7 +201,7 @@ class Scenarios extends Component { this.closeEditModal(data)} scenario={this.state.modalScenario} /> this.closeImportModal(data)} nodes={this.state.nodes} /> - + this.closeDeleteModal(e)} />
    ); } From e4877f4eb8071a1d39dcfc04abf2dfde744101e3 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 17 Sep 2019 17:20:46 +0200 Subject: [PATCH 24/34] see and edit active state of user --- src/user/edit-user.js | 21 ++++++++++++++++++--- src/user/users.js | 1 + 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/user/edit-user.js b/src/user/edit-user.js index 59cafc7..d8ef87c 100644 --- a/src/user/edit-user.js +++ b/src/user/edit-user.js @@ -35,7 +35,8 @@ class EditUserDialog extends React.Component { mail: '', role: '', id: '', - password: '' + password: '', + active: '' } } @@ -56,7 +57,8 @@ class EditUserDialog extends React.Component { var username = true; var role = true; var mail = true; - var pw = true + var pw = true; + var active = true; if (this.state.username === '') { username = false; @@ -74,8 +76,12 @@ class EditUserDialog extends React.Component { pw = false; } + if(this.state.active === ''){ + active = false; + } + // form is valid if any of the fields contain somethig - this.valid = username || role || mail || pw; + this.valid = username || role || mail || pw || active; } @@ -113,6 +119,15 @@ class EditUserDialog extends React.Component { + + + Active + this.handleChange(e)}> + + + + +
    ); diff --git a/src/user/users.js b/src/user/users.js index 304412f..6981f6e 100644 --- a/src/user/users.js +++ b/src/user/users.js @@ -126,6 +126,7 @@ class Users extends Component { this.getHumanRoleName(role)} /> + this.setState({ editModal: true, modalData: this.state.users[index] })} onDelete={index => this.setState({ deleteModal: true, modalData: this.state.users[index] })} /> From ca09a5ee05ae0450e36343f83ec522f79c094a3c Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 7 Oct 2019 16:02:23 +0200 Subject: [PATCH 25/34] fix width of button column --- src/user/users.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/user/users.js b/src/user/users.js index 6981f6e..4cec1ef 100644 --- a/src/user/users.js +++ b/src/user/users.js @@ -113,7 +113,7 @@ class Users extends Component { this.confirmDeleteModal(); } - } + }; render() { @@ -127,7 +127,7 @@ class Users extends Component { this.getHumanRoleName(role)} /> - this.setState({ editModal: true, modalData: this.state.users[index] })} onDelete={index => this.setState({ deleteModal: true, modalData: this.state.users[index] })} /> + this.setState({ editModal: true, modalData: this.state.users[index] })} onDelete={index => this.setState({ deleteModal: true, modalData: this.state.users[index] })} /> From 236233b6db660169465e3f3fb2d4e0ee335c775f Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 7 Oct 2019 16:02:52 +0200 Subject: [PATCH 26/34] missing semicolons --- src/user/users-store.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/user/users-store.js b/src/user/users-store.js index 44622ba..5d88f7a 100644 --- a/src/user/users-store.js +++ b/src/user/users-store.js @@ -38,7 +38,7 @@ class UsersStore extends ArrayStore { title: 'Failed to add new user', message: action.error.response.body.message, level: 'error' - } + }; NotificationsDataManager.addNotification(USER_ADD_ERROR_NOTIFICATION); } @@ -51,7 +51,7 @@ class UsersStore extends ArrayStore { title: 'Failed to edit user', message: action.error.response.body.message, level: 'error' - } + }; NotificationsDataManager.addNotification(USER_EDIT_ERROR_NOTIFICATION); } From beca550aa7e50f8b2207f322b7c61a6726562894 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 7 Oct 2019 16:03:18 +0200 Subject: [PATCH 27/34] update config file --- src/config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.js b/src/config.js index 4054518..82be462 100644 --- a/src/config.js +++ b/src/config.js @@ -1,9 +1,9 @@ const config = { publicPathBase: 'public/', - instance: 'frontend of the Global RT-SuperLab Demonstration', + instance: 'VILLASweb', admin: { - name: 'Steffen Vogel', + name: 'Institute for Automation of Complex Power Systems, RWTH Aachen University, Germany', mail: 'stvogel@eonerc.rwth-aachen.de' } } From c9d678d8dfac43c09282b36345da597023453a0d Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 7 Oct 2019 16:04:34 +0200 Subject: [PATCH 28/34] add user component and menu item for account management, WIP --- src/app.js | 6 +- src/common/menu-sidebar.js | 1 + src/user/user.js | 156 +++++++++++++++++++++++++++++++++++++ 3 files changed, 161 insertions(+), 2 deletions(-) create mode 100644 src/user/user.js diff --git a/src/app.js b/src/app.js index cd07f75..ea6bb5f 100644 --- a/src/app.js +++ b/src/app.js @@ -50,6 +50,7 @@ import Scenarios from './scenario/scenarios'; import Scenario from './scenario/scenario'; import SimulationModel from './simulationmodel/simulation-model'; import Users from './user/users'; +import User from './user/user'; import './styles/app.css'; @@ -108,11 +109,11 @@ class App extends React.Component { showSidebarMenu = () => { this.setState({ showSidebarMenu: true }); - } + }; hideSidebarMenu = () => { this.setState({ showSidebarMenu: false }); - } + }; render() { if (this.state.token == null) { @@ -149,6 +150,7 @@ class App extends React.Component { +
    diff --git a/src/common/menu-sidebar.js b/src/common/menu-sidebar.js index 70a633a..5f43425 100644 --- a/src/common/menu-sidebar.js +++ b/src/common/menu-sidebar.js @@ -38,6 +38,7 @@ class SidebarMenu extends React.Component { { this.props.currentRole === 'Admin' ?
  • User Management
  • : '' } +
  • Account
  • Logout
  • diff --git a/src/user/user.js b/src/user/user.js new file mode 100644 index 0000000..ca424c5 --- /dev/null +++ b/src/user/user.js @@ -0,0 +1,156 @@ +/** + * File: user.js + * Author: Sonja Happ + * Date: 18.09.2019 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React, { Component } from 'react'; +import { Container } from 'flux/utils'; +import {Button, Col, Row, FormGroup, FormLabel} from 'react-bootstrap'; + +import AppDispatcher from '../common/app-dispatcher'; +import UserStore from './user-store'; + +import Icon from '../common/icon'; +import EditUserDialog from './edit-user'; + +import DeleteDialog from '../common/dialogs/delete-dialog'; +import ParametersEditor from "../common/parameters-editor"; + +class User extends Component { + static getStores() { + return [ UserStore ]; + } + + static calculateState(prevState, props) { + prevState = prevState || {}; + + const sessionToken = UserStore.getState().token; + + let user = UserStore.getState().currentUser; + + if(user === null) { + AppDispatcher.dispatch({ + type: 'users/start-load', + data: UserStore.getState().userid, + token: sessionToken + }); + + user = {}; + } + + console.log("extracted user 2: " + user.username); + + return { + user, + + token: sessionToken, + editModal: prevState.editModal || false, + deleteModal: prevState.deleteModal || false, + modalData: prevState.modalData || {} + }; + } + + + closeDeleteModal(confirmDelete) { + this.setState({ deleteModal: false }); + + if (confirmDelete === false) { + return; + } + + AppDispatcher.dispatch({ + type: 'users/start-remove', + data: this.state.modalData, + token: this.state.token + }); + } + + closeEditModal(data) { + this.setState({ editModal: false }); + + if (data) { + AppDispatcher.dispatch({ + type: 'users/start-edit', + data: data, + token: this.state.token + }); + } + } + + getHumanRoleName(role_key) { + const HUMAN_ROLE_NAMES = {Admin: 'Administrator', User: 'User', Guest: 'Guest'}; + + return HUMAN_ROLE_NAMES.hasOwnProperty(role_key)? HUMAN_ROLE_NAMES[role_key] : ''; + } + + onModalKeyPress = (event) => { + if (event.key === 'Enter') { + event.preventDefault(); + + this.confirmDeleteModal(); + } + }; + + render() { + + return ( +
    +

    Your User Account

    + +
    + + Username: + {this.state.user.username} + + + + + E-mail: + {this.state.user.mail} + + + + Role: + {this.state.user.role} + + +
    + +
    + ); + } +} + +{/**/} +{/**/} + +{/* this.closeEditModal(data)} user={this.state.modalData} />*/} +{/* this.closeDeleteModal(e)} />*/} + +{/**/} +{/* */} +{/* */} +{/* */} +{/* this.getHumanRoleName(role)} />*/} +{/* */} +{/*
    */} + + +let fluxContainerConverter = require('../common/FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(User)); From 2b5df63b3405241f42038726fbb9fe30318e9848 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 7 Oct 2019 16:05:08 +0200 Subject: [PATCH 29/34] formatting of home page text --- src/common/home.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/home.js b/src/common/home.js index e866249..ed298ce 100644 --- a/src/common/home.js +++ b/src/common/home.js @@ -64,7 +64,7 @@ class Home extends React.Component { VILLASweb is a frontend for distributed real-time simulation hosted by {config.admin.name}.

    - You are logged in as user {this.state.currentUsername} with ID {this.state.currentUserID} and role {this.state.currentRole}. + You are logged in as user {this.state.currentUsername} with ID {this.state.currentUserID} and role {this.state.currentRole}.

    {/*

    From 6cfe8e4d82531cb6f880b2194e91ce97f7896473 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 22 Oct 2019 15:43:44 +0200 Subject: [PATCH 30/34] improved #197 user can now change own name, email and password --- src/common/array-store.js | 4 ++ src/user/edit-own-user.js | 142 ++++++++++++++++++++++++++++++++++++++ src/user/user.js | 65 ++++++----------- 3 files changed, 167 insertions(+), 44 deletions(-) create mode 100644 src/user/edit-own-user.js diff --git a/src/common/array-store.js b/src/common/array-store.js index 70e9c9e..2789dcd 100644 --- a/src/common/array-store.js +++ b/src/common/array-store.js @@ -115,6 +115,10 @@ class ArrayStore extends ReduceStore { this.dataManager.update(action.data, action.token); return state; + case this.type + '/start-own-edit': + this.dataManager.update(action.data, action.token); + return state; + case this.type + '/edited': return this.updateElements(state, [action.data]); diff --git a/src/user/edit-own-user.js b/src/user/edit-own-user.js new file mode 100644 index 0000000..81c9d9c --- /dev/null +++ b/src/user/edit-own-user.js @@ -0,0 +1,142 @@ +/** + * File: edit-user.js + * Author: Ricardo Hernandez-Montoya + * Date: 02.05.2017 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import {FormGroup, FormControl, FormLabel, Col} from 'react-bootstrap'; + +import Dialog from '../common/dialogs/dialog'; +import UserStore from './user-store'; + + +class EditOwnUserDialog extends React.Component { + valid: true; + + constructor(props) { + super(props); + + this.state = { + username: '', + currentpassword: '', + mail: '', + role: '', + id: '', + password: '', + active: '' + } + } + + + + onClose(canceled) { + if (canceled === false) { + if (this.valid) { + this.props.onClose(this.state); + } + } else { + this.props.onClose(); + } + } + + + + handleChange(e) { + let user = UserStore.getState().currentUser; + console.log("edit-own-user, handlechange methode called"); + this.setState({ [e.target.id]: e.target.value }); + + // check all controls + var username = true; + var role = true; + var mail = true; + var pw = true; + var active = true; + var currentpassword = true; + + if (this.state.username === '') { + username = false; + } + + + if(this.state.mail === ''){ + mail = false; + } + + if(this.state.password === ''){ + pw = false; + } + + if(this.state.active === ''){ + active = false; + } + + if(this.state.currentpassword === ''){ + currentpassword = false; + } + + + this.setState({ + role: user.role, + id: user.id + }); + + // form is valid if any of the fields contain somethig + this.valid = username || role || active || currentpassword || mail || pw; + + } + + resetState() { + this.setState({ + //username: this.props.user.username, + //mail: this.props.user.mail, + role: this.props.user.role, + id: this.props.user.id + }); + } + + render() { + return ( +

    this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> +
    + + Username + this.handleChange(e)} /> + + + + E-mail + this.handleChange(e)} /> + + + Old Password + this.handleChange(e)} /> + + + + New Password + this.handleChange(e)} /> + +
    +
    + ); + } +} + +export default EditOwnUserDialog; diff --git a/src/user/user.js b/src/user/user.js index ca424c5..9817069 100644 --- a/src/user/user.js +++ b/src/user/user.js @@ -21,28 +21,28 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; -import {Button, Col, Row, FormGroup, FormLabel} from 'react-bootstrap'; +import {Button, Col, Row} from 'react-bootstrap'; import AppDispatcher from '../common/app-dispatcher'; import UserStore from './user-store'; +import UsersStore from './users-store'; + import Icon from '../common/icon'; -import EditUserDialog from './edit-user'; +import EditOwnUserDialog from './edit-own-user' -import DeleteDialog from '../common/dialogs/delete-dialog'; -import ParametersEditor from "../common/parameters-editor"; class User extends Component { static getStores() { - return [ UserStore ]; + return [ UserStore, UsersStore ]; } static calculateState(prevState, props) { - prevState = prevState || {}; - - const sessionToken = UserStore.getState().token; + //prevState = prevState || {}; + let sessionToken = UserStore.getState().token; let user = UserStore.getState().currentUser; + if(user === null) { AppDispatcher.dispatch({ @@ -60,52 +60,38 @@ class User extends Component { user, token: sessionToken, - editModal: prevState.editModal || false, - deleteModal: prevState.deleteModal || false, - modalData: prevState.modalData || {} + newModal: false, + editModal: false, + update: false, + modalData: {} }; } - closeDeleteModal(confirmDelete) { - this.setState({ deleteModal: false }); - - if (confirmDelete === false) { - return; - } - - AppDispatcher.dispatch({ - type: 'users/start-remove', - data: this.state.modalData, - token: this.state.token - }); - } closeEditModal(data) { this.setState({ editModal: false }); + console.log(data); if (data) { + + AppDispatcher.dispatch({ - type: 'users/start-edit', + type: 'users/start-own-edit', data: data, token: this.state.token }); } + } + getHumanRoleName(role_key) { const HUMAN_ROLE_NAMES = {Admin: 'Administrator', User: 'User', Guest: 'Guest'}; return HUMAN_ROLE_NAMES.hasOwnProperty(role_key)? HUMAN_ROLE_NAMES[role_key] : ''; } - onModalKeyPress = (event) => { - if (event.key === 'Enter') { - event.preventDefault(); - - this.confirmDeleteModal(); - } - }; render() { @@ -129,6 +115,9 @@ class User extends Component { Role: {this.state.user.role}
    + + + this.closeEditModal(data)} user={this.state.modalData} /> @@ -137,19 +126,7 @@ class User extends Component { } } -{/**/} -{/**/} -{/* this.closeEditModal(data)} user={this.state.modalData} />*/} -{/* this.closeDeleteModal(e)} />*/} - -{/**/} -{/* */} -{/* */} -{/* */} -{/* this.getHumanRoleName(role)} />*/} -{/* */} -{/*
    */} let fluxContainerConverter = require('../common/FluxContainerConverter'); From 14ff56dfafa3fc378e71053388bc96bba305fc15 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Fri, 25 Oct 2019 22:16:36 +0200 Subject: [PATCH 31/34] improved #197 user needs to enter the old password and confirm the new one --- src/user/edit-own-user.js | 29 ++++++++++++++++++++--------- src/user/edit-user.js | 18 +++++++++++++++--- src/user/user.js | 9 +++++++-- src/user/users.js | 7 +++++++ 4 files changed, 49 insertions(+), 14 deletions(-) diff --git a/src/user/edit-own-user.js b/src/user/edit-own-user.js index 81c9d9c..3ec5d23 100644 --- a/src/user/edit-own-user.js +++ b/src/user/edit-own-user.js @@ -34,12 +34,13 @@ class EditOwnUserDialog extends React.Component { this.state = { username: '', - currentpassword: '', mail: '', role: '', id: '', password: '', - active: '' + oldPassword: '', + active: '', + confirmpassword: '' } } @@ -68,7 +69,8 @@ class EditOwnUserDialog extends React.Component { var mail = true; var pw = true; var active = true; - var currentpassword = true; + var oldPassword = true; + var confirmpassword = true; if (this.state.username === '') { username = false; @@ -87,8 +89,12 @@ class EditOwnUserDialog extends React.Component { active = false; } - if(this.state.currentpassword === ''){ - currentpassword = false; + if(this.state.oldPassword === ''){ + oldPassword = false; + } + + if(this.state.confirmpassword === ''){ + confirmpassword = false; } @@ -98,7 +104,7 @@ class EditOwnUserDialog extends React.Component { }); // form is valid if any of the fields contain somethig - this.valid = username || role || active || currentpassword || mail || pw; + this.valid = username || role || active || oldPassword || mail || pw || confirmpassword; } @@ -124,14 +130,19 @@ class EditOwnUserDialog extends React.Component { E-mail this.handleChange(e)} />
    - + Old Password - this.handleChange(e)} /> + this.handleChange(e)} /> New Password - this.handleChange(e)} /> + this.handleChange(e)} /> + + + + Confirm New Password + this.handleChange(e)} />
    diff --git a/src/user/edit-user.js b/src/user/edit-user.js index d8ef87c..a30019a 100644 --- a/src/user/edit-user.js +++ b/src/user/edit-user.js @@ -36,7 +36,8 @@ class EditUserDialog extends React.Component { role: '', id: '', password: '', - active: '' + active: '', + confirmpassword: '' } } @@ -59,6 +60,8 @@ class EditUserDialog extends React.Component { var mail = true; var pw = true; var active = true; + var confirmpassword = true; + if (this.state.username === '') { username = false; @@ -80,8 +83,13 @@ class EditUserDialog extends React.Component { active = false; } + if(this.state.confirmpassword === ''){ + confirmpassword = false; + } + + // form is valid if any of the fields contain somethig - this.valid = username || role || mail || pw || active; + this.valid = username || role || mail || pw || active || confirmpassword; } @@ -109,7 +117,11 @@ class EditUserDialog extends React.Component {
    Password - this.handleChange(e)} /> + this.handleChange(e)} /> + + + Confirm New Password + this.handleChange(e)} /> Role diff --git a/src/user/user.js b/src/user/user.js index 9817069..69e6b1e 100644 --- a/src/user/user.js +++ b/src/user/user.js @@ -74,7 +74,7 @@ class User extends Component { console.log(data); if (data) { - + if(data.password === data.confirmpassword){ AppDispatcher.dispatch({ type: 'users/start-own-edit', @@ -82,6 +82,11 @@ class User extends Component { token: this.state.token }); } + + else{ + console.log("error: not the same password"); + } + } } @@ -115,7 +120,7 @@ class User extends Component { Role: {this.state.user.role} - + this.closeEditModal(data)} user={this.state.modalData} /> diff --git a/src/user/users.js b/src/user/users.js index 4cec1ef..c22e81f 100644 --- a/src/user/users.js +++ b/src/user/users.js @@ -93,12 +93,19 @@ class Users extends Component { this.setState({ editModal: false }); if (data) { + if(data.password === data.confirmpassword){ + AppDispatcher.dispatch({ type: 'users/start-edit', data: data, token: this.state.token }); } + + else{ + console.log("error: not the same password"); + } + } } getHumanRoleName(role_key) { From c9ad98bca044c517a84828455074fda2566deef4 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 29 Oct 2019 10:13:44 +0100 Subject: [PATCH 32/34] improved #197 user will be notified if the confirmed password doesn't match --- src/common/array-store.js | 46 +++++++++++++++++++++++++++++++-------- src/user/edit-user.js | 13 +++++++++-- src/user/user.js | 8 ++++++- src/user/users-store.js | 2 +- src/user/users.js | 6 ++++- 5 files changed, 61 insertions(+), 14 deletions(-) diff --git a/src/common/array-store.js b/src/common/array-store.js index 2789dcd..dbff5c3 100644 --- a/src/common/array-store.js +++ b/src/common/array-store.js @@ -22,6 +22,7 @@ import { ReduceStore } from 'flux/utils'; import AppDispatcher from './app-dispatcher'; +import NotificationsDataManager from '../common/data-managers/notifications-data-manager'; class ArrayStore extends ReduceStore { constructor(type, dataManager) { @@ -84,9 +85,18 @@ class ArrayStore extends ReduceStore { } case this.type + '/load-error': - // TODO: Add error message - return state; - + if (action.error && !action.error.handled && action.error.response) { + + const USER_LOAD_ERROR_NOTIFICATION = { + title: 'Failed to load', + message: action.error.response.body.message, + level: 'error' + }; + NotificationsDataManager.addNotification(USER_LOAD_ERROR_NOTIFICATION); + + } + return super.reduce(state, action); + case this.type + '/start-add': this.dataManager.add(action.data, action.token); return state; @@ -95,8 +105,9 @@ class ArrayStore extends ReduceStore { return this.updateElements(state, [action.data]); case this.type + '/add-error': - // TODO: Add error message - return state; + + return state; + case this.type + '/start-remove': this.dataManager.remove(action.data, action.token); @@ -108,9 +119,18 @@ class ArrayStore extends ReduceStore { }); case this.type + '/remove-error': - // TODO: Add error message - return state; + if (action.error && !action.error.handled && action.error.response) { + const USER_REMOVE_ERROR_NOTIFICATION = { + title: 'Failed to add remove ', + message: action.error.response.body.message, + level: 'error' + }; + NotificationsDataManager.addNotification(USER_REMOVE_ERROR_NOTIFICATION); + + } + return super.reduce(state, action); + case this.type + '/start-edit': this.dataManager.update(action.data, action.token); return state; @@ -122,10 +142,18 @@ class ArrayStore extends ReduceStore { case this.type + '/edited': return this.updateElements(state, [action.data]); - case this.type + '/edit-error': - // TODO: Add error message + case this.type + '/confirm-pw-doesnt-match': + const USER_PW_ERROR_NOTIFICATION = { + title: 'The new password does not match', + message: 'Try again', + level: 'error' + }; + NotificationsDataManager.addNotification(USER_PW_ERROR_NOTIFICATION); return state; + case this.type + '/edit-error': + return state; + default: return state; } diff --git a/src/user/edit-user.js b/src/user/edit-user.js index a30019a..3427452 100644 --- a/src/user/edit-user.js +++ b/src/user/edit-user.js @@ -37,7 +37,8 @@ class EditUserDialog extends React.Component { id: '', password: '', active: '', - confirmpassword: '' + confirmpassword: '', + oldPassword: '' } } @@ -61,6 +62,7 @@ class EditUserDialog extends React.Component { var pw = true; var active = true; var confirmpassword = true; + var oldPW = true; if (this.state.username === '') { @@ -87,9 +89,12 @@ class EditUserDialog extends React.Component { confirmpassword = false; } + if(this.state.oldPassword === ''){ + oldPW = false; + } // form is valid if any of the fields contain somethig - this.valid = username || role || mail || pw || active || confirmpassword; + this.valid = username || role || mail || pw || active || confirmpassword || oldPW; } @@ -115,6 +120,10 @@ class EditUserDialog extends React.Component { E-mail this.handleChange(e)} /> + + Old Password + this.handleChange(e)} /> + Password this.handleChange(e)} /> diff --git a/src/user/user.js b/src/user/user.js index 69e6b1e..74ac1a8 100644 --- a/src/user/user.js +++ b/src/user/user.js @@ -84,7 +84,11 @@ class User extends Component { } else{ - console.log("error: not the same password"); + AppDispatcher.dispatch({ + type: 'users/confirm-pw-doesnt-match', + data: data, + token: this.state.token + }); } } @@ -120,6 +124,8 @@ class User extends Component { Role: {this.state.user.role} + + this.closeEditModal(data)} user={this.state.modalData} /> diff --git a/src/user/users-store.js b/src/user/users-store.js index 5d88f7a..b2ddfe9 100644 --- a/src/user/users-store.js +++ b/src/user/users-store.js @@ -55,7 +55,7 @@ class UsersStore extends ArrayStore { NotificationsDataManager.addNotification(USER_EDIT_ERROR_NOTIFICATION); } - return super.reduce(state, action); + return super.reduce(state, action); default: return super.reduce(state, action); diff --git a/src/user/users.js b/src/user/users.js index c22e81f..1b788a0 100644 --- a/src/user/users.js +++ b/src/user/users.js @@ -103,7 +103,11 @@ class Users extends Component { } else{ - console.log("error: not the same password"); + AppDispatcher.dispatch({ + type: 'users/confirm-pw-doesnt-match', + data: data, + token: this.state.token + }); } } } From 5ecb254e13a92ff7270379e6e44ac818113fb712 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 29 Oct 2019 14:41:35 +0100 Subject: [PATCH 33/34] renamed visualization to dashboard --- src/app.js | 4 +- src/common/array-store.js | 1 + src/common/home.js | 2 +- .../dashboard-store.js} | 6 +- .../dashboard.js} | 134 +++++++++--------- .../dashboards-data-manager.js} | 4 +- src/{visualization => dashboard}/dropzone.js | 0 .../edit-dashboard.js} | 12 +- src/{visualization => dashboard}/grid.js | 0 .../import-dashboard.js} | 14 +- .../new-dashboard.js} | 4 +- .../toolbox-item.js | 0 src/project/project.js | 70 ++++----- src/scenario/scenarios.js | 1 + src/styles/app.css | 2 +- src/user/edit-own-user.js | 1 - src/widget/widgets/topology.js | 14 +- 17 files changed, 135 insertions(+), 134 deletions(-) rename src/{visualization/visualization-store.js => dashboard/dashboard-store.js} (83%) rename src/{visualization/visualization.js => dashboard/dashboard.js} (77%) rename src/{visualization/visualizations-data-manager.js => dashboard/dashboards-data-manager.js} (89%) rename src/{visualization => dashboard}/dropzone.js (100%) rename src/{visualization/edit-visualization.js => dashboard/edit-dashboard.js} (84%) rename src/{visualization => dashboard}/grid.js (100%) rename src/{visualization/import-visualization.js => dashboard/import-dashboard.js} (85%) rename src/{visualization/new-visualization.js => dashboard/new-dashboard.js} (91%) rename src/{visualization => dashboard}/toolbox-item.js (100%) diff --git a/src/app.js b/src/app.js index ea6bb5f..92bb42c 100644 --- a/src/app.js +++ b/src/app.js @@ -43,7 +43,7 @@ import HeaderMenu from './common/header-menu'; //import Projects from './project/projects'; //import Project from './project/project'; import Simulators from './simulator/simulators'; -import Visualization from './visualization/visualization'; +import Dashboard from './dashboard/dashboard'; //import Simulations from './simulation/simulations'; //import Simulation from './simulation/simulation'; import Scenarios from './scenario/scenarios'; @@ -145,7 +145,7 @@ class App extends React.Component {
    - + diff --git a/src/common/array-store.js b/src/common/array-store.js index dbff5c3..1d76845 100644 --- a/src/common/array-store.js +++ b/src/common/array-store.js @@ -68,6 +68,7 @@ class ArrayStore extends ReduceStore { reduce(state, action) { switch (action.type) { case this.type + '/start-load': + if (Array.isArray(action.data)) { action.data.forEach((id) => { this.dataManager.load(id, action.token); diff --git a/src/common/home.js b/src/common/home.js index ed298ce..654ea6d 100644 --- a/src/common/home.js +++ b/src/common/home.js @@ -68,7 +68,7 @@ class Home extends React.Component {

    {/*

    - This instance is hosting {this.getCounts('projects')} projects consisting of {this.getCounts('simulators')} simulators, {this.getCounts('visualizations')} visualizations and {this.getCounts('simulations')} simulations. + This instance is hosting {this.getCounts('projects')} projects consisting of {this.getCounts('simulators')} simulators, {this.getCounts('dashboards')} dashboards and {this.getCounts('simulations')} simulations. A total of {this.getCounts('users')} users are registered.

    */} diff --git a/src/visualization/visualization-store.js b/src/dashboard/dashboard-store.js similarity index 83% rename from src/visualization/visualization-store.js rename to src/dashboard/dashboard-store.js index adadd2d..28bb9cb 100644 --- a/src/visualization/visualization-store.js +++ b/src/dashboard/dashboard-store.js @@ -1,5 +1,5 @@ /** - * File: visualization-store.js + * File: dashboard-store.js * Author: Markus Grigull * Date: 02.03.2017 * @@ -20,6 +20,6 @@ ******************************************************************************/ import ArrayStore from '../common/array-store'; -import VisualizationsDataManager from './visualizations-data-manager'; +import DashboardsDataManager from './dashboards-data-manager'; -export default new ArrayStore('visualizations', VisualizationsDataManager); +export default new ArrayStore('dashboards', DashboardsDataManager); diff --git a/src/visualization/visualization.js b/src/dashboard/dashboard.js similarity index 77% rename from src/visualization/visualization.js rename to src/dashboard/dashboard.js index 59ffbc1..1683bd3 100644 --- a/src/visualization/visualization.js +++ b/src/dashboard/dashboard.js @@ -1,5 +1,5 @@ /** - * File: visualization.js + * File: dashboard.js * Author: Markus Grigull * Date: 02.03.2017 * @@ -36,7 +36,7 @@ import EditWidget from '../widget/edit-widget'; import Grid from './grid'; import UserStore from '../user/user-store'; -import VisualizationStore from './visualization-store'; +import DashboardStore from './dashboard-store'; import ProjectStore from '../project/project-store'; import SimulationStore from '../simulation/simulation-store'; import SimulationModelStore from '../simulationmodel/simulation-model-store'; @@ -47,9 +47,9 @@ import NotificationsFactory from '../common/data-managers/notifications-factory' import 'react-contexify/dist/ReactContexify.min.css'; -class Visualization extends React.Component { +class Dashboard extends React.Component { static getStores() { - return [ VisualizationStore, ProjectStore, SimulationStore, SimulationModelStore, FileStore, UserStore ]; + return [ DashboardStore, ProjectStore, SimulationStore, SimulationModelStore, FileStore, UserStore ]; } static calculateState(prevState, props) { @@ -64,12 +64,12 @@ class Visualization extends React.Component { return { sessionToken: UserStore.getState().token, - visualizations: VisualizationStore.getState(), + dashboards: DashboardStore.getState(), projects: ProjectStore.getState(), simulations: SimulationStore.getState(), files: FileStore.getState(), - visualization: prevState.visualization || {}, + dashboard: prevState.dashboard || {}, project: prevState.project || null, simulation: prevState.simulation || null, simulationModels, @@ -92,7 +92,7 @@ class Visualization extends React.Component { //document.addEventListener('keydown', this.handleKeydown.bind(this)); AppDispatcher.dispatch({ - type: 'visualizations/start-load', + type: 'dashboards/start-load', token }); } @@ -102,14 +102,14 @@ class Visualization extends React.Component { } componentDidUpdate() { - if (this.state.visualization._id !== this.props.match.params.visualization) { - this.reloadVisualization(); + if (this.state.dashboard._id !== this.props.match.params.dashboard) { + this.reloadDashboard(); } // load depending project if (this.state.project == null && this.state.projects) { this.state.projects.forEach((project) => { - if (project._id === this.state.visualization.project) { + if (project._id === this.state.dashboard.project) { this.setState({ project: project, simulation: null }); const token = localStorage.getItem('token'); @@ -161,25 +161,25 @@ class Visualization extends React.Component { return Object.keys(widgets).map( (key) => widgets[key]); } - reloadVisualization() { - // select visualization by param id - this.state.visualizations.forEach((tempVisualization) => { - if (tempVisualization._id === this.props.match.params.visualization) { + reloadDashboard() { + // select dashboard by param id + this.state.dashboards.forEach((tempDashboard) => { + if (tempDashboard._id === this.props.match.params.dashboard) { // convert widgets list to a dictionary - var visualization = Object.assign({}, tempVisualization, { - widgets: tempVisualization.widgets ? this.transformToWidgetsDict(tempVisualization.widgets) : {} + var dashboard = Object.assign({}, tempDashboard, { + widgets: tempDashboard.widgets ? this.transformToWidgetsDict(tempDashboard.widgets) : {} }); - this.computeHeightWithWidgets(visualization.widgets); + this.computeHeightWithWidgets(dashboard.widgets); - this.setState({ visualization: visualization, project: null }); + this.setState({ dashboard: dashboard, project: null }); const token = localStorage.getItem('token'); AppDispatcher.dispatch({ type: 'projects/start-load', - data: visualization.project, + data: dashboard.project, token }); } @@ -187,9 +187,9 @@ class Visualization extends React.Component { } snapToGrid(value) { - if (this.state.visualization.grid === 1) return value; + if (this.state.dashboard.grid === 1) return value; - return Math.round(value / this.state.visualization.grid) * this.state.visualization.grid; + return Math.round(value / this.state.dashboard.grid) * this.state.dashboard.grid; } handleDrop(item, position) { @@ -210,17 +210,17 @@ class Visualization extends React.Component { // create new widget widget = WidgetFactory.createWidgetOfType(item.name, position, defaultSimulationModel); - var new_widgets = this.state.visualization.widgets; + var new_widgets = this.state.dashboard.widgets; var new_key = Object.keys(new_widgets).length; new_widgets[new_key] = widget; - var visualization = Object.assign({}, this.state.visualization, { + var dashboard = Object.assign({}, this.state.dashboard, { widgets: new_widgets }); this.increaseHeightWithWidget(widget); - this.setState({ visualization: visualization }); + this.setState({ dashboard: dashboard }); } widgetStatusChange(updated_widget, key) { @@ -231,17 +231,17 @@ class Visualization extends React.Component { widgetChange(updated_widget, key, callback = null) { var widgets_update = {}; widgets_update[key] = updated_widget; - var new_widgets = Object.assign({}, this.state.visualization.widgets, widgets_update); + var new_widgets = Object.assign({}, this.state.dashboard.widgets, widgets_update); - var visualization = Object.assign({}, this.state.visualization, { + var dashboard = Object.assign({}, this.state.dashboard, { widgets: new_widgets }); // Check if the height needs to be increased, the section may have shrunk if not if (!this.increaseHeightWithWidget(updated_widget)) { - this.computeHeightWithWidgets(visualization.widgets); + this.computeHeightWithWidgets(dashboard.widgets); } - this.setState({ visualization: visualization }, callback); + this.setState({ dashboard: dashboard }, callback); } /* @@ -279,7 +279,7 @@ class Visualization extends React.Component { } editWidget(e, data) { - this.setState({ editModal: true, modalData: this.state.visualization.widgets[data.key], modalIndex: data.key }); + this.setState({ editModal: true, modalData: this.state.dashboard.widgets[data.key], modalIndex: data.key }); } closeEdit(data) { @@ -288,24 +288,24 @@ class Visualization extends React.Component { var widgets_update = {}; widgets_update[this.state.modalIndex] = data; - var new_widgets = Object.assign({}, this.state.visualization.widgets, widgets_update); + var new_widgets = Object.assign({}, this.state.dashboard.widgets, widgets_update); - var visualization = Object.assign({}, this.state.visualization, { + var dashboard = Object.assign({}, this.state.dashboard, { widgets: new_widgets }); - this.setState({ editModal: false, visualization: visualization }); + this.setState({ editModal: false, dashboard: dashboard }); } else { this.setState({ editModal: false }); } } deleteWidget(e, data) { - delete this.state.visualization.widgets[data.key]; - var visualization = Object.assign({}, this.state.visualization, { - widgets: this.state.visualization.widgets + delete this.state.dashboard.widgets[data.key]; + var dashboard = Object.assign({}, this.state.dashboard, { + widgets: this.state.dashboard.widgets }); - this.setState({ visualization: visualization }); + this.setState({ dashboard: dashboard }); } stopEditing() { @@ -315,36 +315,36 @@ class Visualization extends React.Component { saveChanges() { // Transform to a list - var visualization = Object.assign({}, this.state.visualization, { - widgets: this.transformToWidgetsList(this.state.visualization.widgets) + var dashboard = Object.assign({}, this.state.dashboard, { + widgets: this.transformToWidgetsList(this.state.dashboard.widgets) }); const token = localStorage.getItem('token'); AppDispatcher.dispatch({ - type: 'visualizations/start-edit', - data: visualization, + type: 'dashboards/start-edit', + data: dashboard, token }); } discardChanges() { - this.setState({ editing: false, visualization: {} }); + this.setState({ editing: false, dashboard: {} }); - this.reloadVisualization(); + this.reloadDashboard(); } moveWidget(e, data, applyDirection) { - var widget = this.state.visualization.widgets[data.key]; + var widget = this.state.dashboard.widgets[data.key]; var updated_widgets = {}; updated_widgets[data.key] = applyDirection(widget); - var new_widgets = Object.assign({}, this.state.visualization.widgets, updated_widgets); + var new_widgets = Object.assign({}, this.state.dashboard.widgets, updated_widgets); - var visualization = Object.assign({}, this.state.visualization, { + var dashboard = Object.assign({}, this.state.dashboard, { widgets: new_widgets }); - this.setState({ visualization: visualization }); + this.setState({ dashboard: dashboard }); } moveAbove(widget) { @@ -380,39 +380,39 @@ class Visualization extends React.Component { value = 1; } - let visualization = Object.assign({}, this.state.visualization, { + let dashboard = Object.assign({}, this.state.dashboard, { grid: value }); - this.setState({ visualization }); + this.setState({ dashboard }); } lockWidget(data) { // lock the widget - let widget = this.state.visualization.widgets[data.key]; + let widget = this.state.dashboard.widgets[data.key]; widget.locked = true; - // update visualization + // update dashboard let widgets = {}; widgets[data.key] = widget; - widgets = Object.assign({}, this.state.visualization.widgets, widgets); + widgets = Object.assign({}, this.state.dashboard.widgets, widgets); - const visualization = Object.assign({}, this.state.visualization, { widgets }); - this.setState({ visualization }); + const dashboard = Object.assign({}, this.state.dashboard, { widgets }); + this.setState({ dashboard }); } unlockWidget(data) { // lock the widget - let widget = this.state.visualization.widgets[data.key]; + let widget = this.state.dashboard.widgets[data.key]; widget.locked = false; - // update visualization + // update dashboard let widgets = {}; widgets[data.key] = widget; - widgets = Object.assign({}, this.state.visualization.widgets, widgets); + widgets = Object.assign({}, this.state.dashboard.widgets, widgets); - const visualization = Object.assign({}, this.state.visualization, { widgets }); - this.setState({ visualization }); + const dashboard = Object.assign({}, this.state.dashboard, { widgets }); + this.setState({ dashboard }); } pauseData = () => { @@ -424,7 +424,7 @@ class Visualization extends React.Component { } render() { - const current_widgets = this.state.visualization.widgets; + const current_widgets = this.state.dashboard.widgets; let boxClasses = classNames('section', 'box', { 'fullscreen-container': this.props.isFullscreen }); @@ -437,8 +437,8 @@ class Visualization extends React.Component { buttons.push({ click: () => this.discardChanges(), icon: 'ban', text: 'Cancel' }); gridControl =
    - Grid: {this.state.visualization.grid > 1 ? this.state.visualization.grid : 'Disabled'} - this.setGrid(value)} /> + Grid: {this.state.dashboard.grid > 1 ? this.state.dashboard.grid : 'Disabled'} + this.setGrid(value)} />
    } @@ -464,7 +464,7 @@ class Visualization extends React.Component {
    - {this.state.visualization.name} + {this.state.dashboard.name}
    @@ -511,20 +511,20 @@ class Visualization extends React.Component { onWidgetStatusChange={(w, k) => this.widgetStatusChange(w, k)} editing={this.state.editing} index={widget_key} - grid={this.state.visualization.grid} + grid={this.state.dashboard.grid} paused={this.state.paused} /> ))} - + {current_widgets != null && Object.keys(current_widgets).map(widget_key => { const data = { key: widget_key }; - const locked = this.state.visualization.widgets[widget_key].locked; - const disabledMove = locked || this.state.visualization.widgets[widget_key].type === 'Box'; + const locked = this.state.dashboard.widgets[widget_key].locked; + const disabledMove = locked || this.state.dashboard.widgets[widget_key].type === 'Box'; return this.editWidget(e, data)}>Edit @@ -548,4 +548,4 @@ class Visualization extends React.Component { } let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Fullscreenable()(Container.create(fluxContainerConverter.convert(Visualization), { withProps: true })); +export default Fullscreenable()(Container.create(fluxContainerConverter.convert(Dashboard), { withProps: true })); diff --git a/src/visualization/visualizations-data-manager.js b/src/dashboard/dashboards-data-manager.js similarity index 89% rename from src/visualization/visualizations-data-manager.js rename to src/dashboard/dashboards-data-manager.js index ee12b3e..a39e017 100644 --- a/src/visualization/visualizations-data-manager.js +++ b/src/dashboard/dashboards-data-manager.js @@ -1,5 +1,5 @@ /** - * File: visualizations-data-manager.js + * File: dashboards-data-manager.js * Author: Markus Grigull * Date: 03.03.2017 * @@ -21,4 +21,4 @@ import RestDataManager from '../common/data-managers/rest-data-manager'; -export default new RestDataManager('visualization', '/visualizations'); +export default new RestDataManager('dashboard', '/dashboards'); diff --git a/src/visualization/dropzone.js b/src/dashboard/dropzone.js similarity index 100% rename from src/visualization/dropzone.js rename to src/dashboard/dropzone.js diff --git a/src/visualization/edit-visualization.js b/src/dashboard/edit-dashboard.js similarity index 84% rename from src/visualization/edit-visualization.js rename to src/dashboard/edit-dashboard.js index c8514c8..1e2fdd6 100644 --- a/src/visualization/edit-visualization.js +++ b/src/dashboard/edit-dashboard.js @@ -1,5 +1,5 @@ /** - * File: new-visualization.js + * File: new-dashboard.js * Author: Markus Grigull * Date: 03.03.2017 * @@ -24,7 +24,7 @@ import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from '../common/dialogs/dialog'; -class EditVisualizationDialog extends React.Component { +class EditDashboardDialog extends React.Component { valid: false; constructor(props) { @@ -52,8 +52,8 @@ class EditVisualizationDialog extends React.Component { resetState() { this.setState({ - name: this.props.visualization.name, - _id: this.props.visualization._id + name: this.props.dashboard.name, + _id: this.props.dashboard._id }); } @@ -75,7 +75,7 @@ class EditVisualizationDialog extends React.Component { render() { return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}>
    Name @@ -88,4 +88,4 @@ class EditVisualizationDialog extends React.Component { } } -export default EditVisualizationDialog; +export default EditDashboardDialog; diff --git a/src/visualization/grid.js b/src/dashboard/grid.js similarity index 100% rename from src/visualization/grid.js rename to src/dashboard/grid.js diff --git a/src/visualization/import-visualization.js b/src/dashboard/import-dashboard.js similarity index 85% rename from src/visualization/import-visualization.js rename to src/dashboard/import-dashboard.js index a833d70..8144193 100644 --- a/src/visualization/import-visualization.js +++ b/src/dashboard/import-dashboard.js @@ -24,7 +24,7 @@ import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from '../common/dialogs/dialog'; -class ImportVisualizationDialog extends React.Component { +class ImportDashboardDialog extends React.Component { valid = false; imported = false; @@ -69,14 +69,14 @@ class ImportVisualizationDialog extends React.Component { reader.onload = function(event) { // read simulator - const visualization = JSON.parse(event.target.result); + const dashboard = JSON.parse(event.target.result); let defaultSimulator = ""; if (self.props.simulation.models != null) { defaultSimulator = self.props.simulation.models[0].simulator; } - visualization.widgets.forEach(widget => { + dashboard.widgets.forEach(widget => { switch (widget.type) { case 'Value': case 'Plot': @@ -93,7 +93,7 @@ class ImportVisualizationDialog extends React.Component { self.imported = true; self.valid = true; - self.setState({ name: visualization.name, widgets: visualization.widgets, grid: visualization.grid }); + self.setState({ name: dashboard.name, widgets: dashboard.widgets, grid: dashboard.grid }); }; reader.readAsText(file); @@ -115,10 +115,10 @@ class ImportVisualizationDialog extends React.Component { render() { return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - Visualization File + Dashboard File this.loadFile(e.target.files)} /> @@ -133,4 +133,4 @@ class ImportVisualizationDialog extends React.Component { } } -export default ImportVisualizationDialog; +export default ImportDashboardDialog; diff --git a/src/visualization/new-visualization.js b/src/dashboard/new-dashboard.js similarity index 91% rename from src/visualization/new-visualization.js rename to src/dashboard/new-dashboard.js index 5618c14..cbac2cb 100644 --- a/src/visualization/new-visualization.js +++ b/src/dashboard/new-dashboard.js @@ -1,5 +1,5 @@ /** - * File: new-visualization.js + * File: new-dashboard.js * Author: Markus Grigull * Date: 03.03.2017 * @@ -71,7 +71,7 @@ class NewVisualzationDialog extends React.Component { render() { return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> Name diff --git a/src/visualization/toolbox-item.js b/src/dashboard/toolbox-item.js similarity index 100% rename from src/visualization/toolbox-item.js rename to src/dashboard/toolbox-item.js diff --git a/src/project/project.js b/src/project/project.js index 78679d7..f6c9530 100644 --- a/src/project/project.js +++ b/src/project/project.js @@ -27,21 +27,21 @@ import FileSaver from 'file-saver'; import AppDispatcher from '../common/app-dispatcher'; import ProjectStore from './project-store'; import UserStore from '../user/user-store'; -import VisualizationStore from '../visualization/visualization-store'; +import DashboardStore from '../dashboard/dashboard-store'; import SimulationStore from '../simulation/simulation-store'; import Icon from '../common/icon'; import CustomTable from '../common/table'; import TableColumn from '../common/table-column'; -import NewVisualzationDialog from '../visualization/new-visualization'; -import EditVisualizationDialog from '../visualization/edit-visualization'; -import ImportVisualizationDialog from '../visualization/import-visualization'; +import NewVisualzationDialog from '../dashboard/new-dashboard'; +import EditDashboardDialog from '../dashboard/edit-dashboard'; +import ImportDashboardDialog from '../dashboard/import-dashboard'; import DeleteDialog from '../common/dialogs/delete-dialog'; -class Visualizations extends Component { +class Dashboards extends Component { static getStores() { - return [ ProjectStore, VisualizationStore, UserStore, SimulationStore ]; + return [ ProjectStore, DashboardStore, UserStore, SimulationStore ]; } static calculateState(prevState, props) { @@ -68,15 +68,15 @@ class Visualizations extends Component { simulation = SimulationStore.getState().find(simulation => simulation._id === project.simulation); } - // load visualizations - let visualizations = []; + // load dashboards + let dashboards = []; - if (project.visualizations != null) { - visualizations = VisualizationStore.getState().filter(visualization => project.visualizations.includes(visualization._id)); + if (project.dashboards != null) { + dashboards = DashboardStore.getState().filter(dashboard => project.dashboards.includes(dashboard._id)); } return { - visualizations, + dashboards, project, simulation, sessionToken, @@ -91,7 +91,7 @@ class Visualizations extends Component { componentDidMount() { AppDispatcher.dispatch({ - type: 'visualizations/start-load', + type: 'dashboards/start-load', token: this.state.sessionToken }); @@ -105,11 +105,11 @@ class Visualizations extends Component { this.setState({ newModal: false }); if (data) { - // add project to visualization + // add project to dashboard data.project = this.state.project._id; AppDispatcher.dispatch({ - type: 'visualizations/start-add', + type: 'dashboards/start-add', data: data, token: this.state.sessionToken }); @@ -132,7 +132,7 @@ class Visualizations extends Component { } AppDispatcher.dispatch({ - type: 'visualizations/start-remove', + type: 'dashboards/start-remove', data: this.state.modalData, token: this.state.sessionToken }); @@ -143,7 +143,7 @@ class Visualizations extends Component { if (data) { AppDispatcher.dispatch({ - type: 'visualizations/start-edit', + type: 'dashboards/start-edit', data: data, token: this.state.sessionToken }); @@ -157,7 +157,7 @@ class Visualizations extends Component { data.project = this.state.project._id; AppDispatcher.dispatch({ - type: 'visualizations/start-add', + type: 'dashboards/start-add', data, token: this.state.sessionToken }); @@ -172,20 +172,20 @@ class Visualizations extends Component { } } - exportVisualization(index) { + exportDashboard(index) { // filter properties - let visualization = Object.assign({}, this.state.visualizations[index]); - delete visualization._id; - delete visualization.project; - delete visualization.user; + let dashboard = Object.assign({}, this.state.dashboards[index]); + delete dashboard._id; + delete dashboard.project; + delete dashboard.user; - visualization.widgets.forEach(widget => { + dashboard.widgets.forEach(widget => { delete widget.simulator; }); // show save dialog - const blob = new Blob([JSON.stringify(visualization, null, 2)], { type: 'application/json' }); - FileSaver.saveAs(blob, 'visualization - ' + visualization.name + '.json'); + const blob = new Blob([JSON.stringify(dashboard, null, 2)], { type: 'application/json' }); + FileSaver.saveAs(blob, 'dashboard - ' + dashboard.name + '.json'); } onModalKeyPress = (event) => { @@ -205,31 +205,31 @@ class Visualizations extends Component {

    {this.state.project.name}

    - - + + this.setState({ editModal: true, modalData: this.state.visualizations[index] })} - onDelete={(index) => this.setState({ deleteModal: true, modalData: this.state.visualizations[index] })} - onExport={index => this.exportVisualization(index)} + onEdit={(index) => this.setState({ editModal: true, modalData: this.state.dashboards[index] })} + onDelete={(index) => this.setState({ deleteModal: true, modalData: this.state.dashboards[index] })} + onExport={index => this.exportDashboard(index)} /> - + this.closeNewModal(data)} /> - this.closeEditModal(data)} visualization={this.state.modalData} /> - this.closeImportModal(data)} simulation={this.state.simulation} /> + this.closeEditModal(data)} dashboard={this.state.modalData} /> + this.closeImportModal(data)} simulation={this.state.simulation} /> - +
    ); } } let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Container.create(fluxContainerConverter.convert(Visualizations), {withProps: true}); +export default Container.create(fluxContainerConverter.convert(Dashboards), {withProps: true}); diff --git a/src/scenario/scenarios.js b/src/scenario/scenarios.js index ab6e173..5789e31 100644 --- a/src/scenario/scenarios.js +++ b/src/scenario/scenarios.js @@ -45,6 +45,7 @@ class Scenarios extends Component { static calculateState() { const scenarios = ScenarioStore.getState(); const sessionToken = UserStore.getState().token; + console.log(scenarios); return { scenarios, diff --git a/src/styles/app.css b/src/styles/app.css index 552f7ed..45e8557 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -216,7 +216,7 @@ body { } /** - * Visualizations + * Dashboards */ .fullscreen-container { padding: 10px; diff --git a/src/user/edit-own-user.js b/src/user/edit-own-user.js index 3ec5d23..bb37f50 100644 --- a/src/user/edit-own-user.js +++ b/src/user/edit-own-user.js @@ -60,7 +60,6 @@ class EditOwnUserDialog extends React.Component { handleChange(e) { let user = UserStore.getState().currentUser; - console.log("edit-own-user, handlechange methode called"); this.setState({ [e.target.id]: e.target.value }); // check all controls diff --git a/src/widget/widgets/topology.js b/src/widget/widgets/topology.js index c47b155..bd7c62a 100644 --- a/src/widget/widgets/topology.js +++ b/src/widget/widgets/topology.js @@ -86,7 +86,7 @@ class WidgetTopology extends React.Component { this.Viewer = null; this.state = { - visualizationState: 'initial' + dashboardState: 'initial' }; } @@ -108,13 +108,13 @@ class WidgetTopology extends React.Component { componentWillReceiveProps(nextProps) { const file = nextProps.files.find(file => file._id === nextProps.widget.file); // Ensure model is requested only once or a different was selected - if (this.props.widget.file !== nextProps.widget.file || (this.state.visualizationState === 'initial' && file)) { - this.setState({'visualizationState': 'loading' }); + if (this.props.widget.file !== nextProps.widget.file || (this.state.dashboardState === 'initial' && file)) { + this.setState({'dashboardState': 'loading' }); if (file) { fetch(new Request('/' + config.publicPathBase + file.path)) .then( response => { if (response.status === 200) { - this.setState({'visualizationState': 'ready' }); + this.setState({'dashboardState': 'ready' }); return response.text().then( contents => { if (this.svgElem) { let cimsvgInstance = new cimsvg(this.svgElem.current); @@ -135,7 +135,7 @@ class WidgetTopology extends React.Component { .catch(error => { console.error(error); this.setState({ - 'visualizationState': 'show_message', + 'dashboardState': 'show_message', 'message': 'Topology could not be loaded.'}); }); } @@ -143,7 +143,7 @@ class WidgetTopology extends React.Component { // No file has been selected if (!nextProps.widget.file) { this.setState({ - 'visualizationState': 'show_message', + 'dashboardState': 'show_message', 'message': 'Select a topology model first.'}); } } @@ -152,7 +152,7 @@ class WidgetTopology extends React.Component { render() { var markup = null; - switch(this.state.visualizationState) { + switch(this.state.dashboardState) { case 'loading': markup =
    ; break; case 'show_message': From 7331bf517b7c61df9d02ff40cdcb726b7e8f2e35 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 4 Nov 2019 15:20:54 +0100 Subject: [PATCH 34/34] cherry picked all changes from the cleanup-widgets branch and merged them to the new file/ folder structure and package versions; most likely, further fixes are required to make things work. Improves #209 and #205 --- package-lock.json | 37 +- package.json | 2 +- src/dashboard/dashboard-button-group.js | 96 +++++ src/dashboard/dashboard.js | 494 +++++++++--------------- src/dashboard/widget-area.js | 78 ++++ src/dashboard/widget-context-menu.js | 123 ++++++ src/dashboard/widget-toolbox.js | 77 ++++ src/widget/editable-widget-container.js | 142 +++++++ src/widget/widget-container.js | 47 +++ src/widget/widget.js | 217 +++-------- 10 files changed, 823 insertions(+), 490 deletions(-) create mode 100644 src/dashboard/dashboard-button-group.js create mode 100644 src/dashboard/widget-area.js create mode 100644 src/dashboard/widget-context-menu.js create mode 100644 src/dashboard/widget-toolbox.js create mode 100644 src/widget/editable-widget-container.js create mode 100644 src/widget/widget-container.js diff --git a/package-lock.json b/package-lock.json index dfcc0c4..807685b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5153,11 +5153,18 @@ } }, "eslint-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.0.tgz", - "integrity": "sha512-7ehnzPaP5IIEh1r1tkjuIrxqhNkzUJa9z3R92tLJdZIVdWaczEhr3EbhGtsMrVxi1KeR8qA7Off6SWc5WNQqyQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", "requires": { - "eslint-visitor-keys": "^1.0.0" + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" + } } }, "eslint-visitor-keys": { @@ -6048,9 +6055,9 @@ "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==" }, "handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.1.tgz", + "integrity": "sha512-C29UoFzHe9yM61lOsIlCE5/mQVGrnIOrOq7maQl76L7tYPCgC1og0Ajt6uWnX4ZTxBPnjw+CUvawphwCfJgUnA==", "requires": { "neo-async": "^2.6.0", "optimist": "^0.6.1", @@ -12841,13 +12848,21 @@ "integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw==" }, "uglify-js": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", - "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "version": "3.6.7", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.7.tgz", + "integrity": "sha512-4sXQDzmdnoXiO+xvmTzQsfIiwrjUCSA95rSP4SEd8tDb51W2TiDOlL76Hl+Kw0Ie42PSItCW8/t6pBNCF2R48A==", "optional": true, "requires": { - "commander": "~2.20.0", + "commander": "~2.20.3", "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "optional": true + } } }, "uncontrollable": { diff --git a/package.json b/package.json index 16782d4..9ce2493 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "flux": "^3.1.3", "frontend-collective-react-dnd-scrollzone": "^1.0.2", "gaugeJS": "^1.3.7", - "handlebars": "^4.1.2", + "handlebars": "^4.5.1", "immutable": "^4.0.0-rc.12", "jquery": "^3.4.1", "jszip": "^3.2.2", diff --git a/src/dashboard/dashboard-button-group.js b/src/dashboard/dashboard-button-group.js new file mode 100644 index 0000000..785ac48 --- /dev/null +++ b/src/dashboard/dashboard-button-group.js @@ -0,0 +1,96 @@ +/** + * File: dashboard-button-group.js + * Author: Markus Grigull + * Date: 31.05.2018 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import PropTypes from 'prop-types'; +import { Button } from 'react-bootstrap'; + +class DashboardButtonGroup extends React.Component { + render() { + const buttonStyle = { + marginLeft: '8px' + }; + + const buttons = []; + let key = 0; + + if (this.props.fullscreen) { + return null; + } + + if (this.props.editing) { + buttons.push( + , + + ); + } else { + if (this.props.fullscreen !== true) { + buttons.push( + + ); + } + + if (this.props.paused) { + buttons.push( + + ); + } else { + buttons.push( + + ); + } + + buttons.push( + + ); + } + + return
    + {buttons} +
    ; + } +} + +DashboardButtonGroup.propTypes = { + editing: PropTypes.bool, + fullscreen: PropTypes.bool, + paused: PropTypes.bool, + onEdit: PropTypes.func, + onSave: PropTypes.func, + onCancel: PropTypes.func, + onFullscreen: PropTypes.func, + onPause: PropTypes.func, + onUnpause: PropTypes.func +}; + +export default DashboardButtonGroup; diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 1683bd3..80b5406 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -21,19 +21,18 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { Button, ButtonToolbar } from 'react-bootstrap'; -import { ContextMenu, Item, Separator } from 'react-contexify'; import Fullscreenable from 'react-fullscreenable'; -import Slider from 'rc-slider'; import classNames from 'classnames'; +import { Map } from 'immutable' -import Icon from '../common/icon'; -import WidgetFactory from '../widget/widget-factory'; -import ToolboxItem from './toolbox-item'; -import Dropzone from './dropzone'; +//import Icon from '../common/icon'; import Widget from '../widget/widget'; import EditWidget from '../widget/edit-widget'; -import Grid from './grid'; + +import WidgetContextMenu from './widget-context-menu'; +import WidgetToolbox from './widget-toolbox'; +import WidgetArea from './widget-area'; +import DashboardButtonGroup from './dashboard-button-group'; import UserStore from '../user/user-store'; import DashboardStore from './dashboard-store'; @@ -42,12 +41,12 @@ import SimulationStore from '../simulation/simulation-store'; import SimulationModelStore from '../simulationmodel/simulation-model-store'; import FileStore from '../file/file-store'; import AppDispatcher from '../common/app-dispatcher'; -import NotificationsDataManager from '../common/data-managers/notifications-data-manager'; -import NotificationsFactory from '../common/data-managers/notifications-factory'; import 'react-contexify/dist/ReactContexify.min.css'; class Dashboard extends React.Component { + + static lastWidgetKey = 0; static getStores() { return [ DashboardStore, ProjectStore, SimulationStore, SimulationModelStore, FileStore, UserStore ]; } @@ -57,19 +56,46 @@ class Dashboard extends React.Component { prevState = {}; } + let dashboard = Map(); + let rawDashboard = DashboardStore.getState().find(v => v._id === props.match.params.dashboard); + + if (rawDashboard != null) { + dashboard = Map(rawDashboard); + + // convert widgets list to a dictionary to be able to reference widgets + const widgets = {}; + + for (let widget of dashboard.get('widgets')) { + widgets[this.getNewWidgetKey()] = widget; + } + + dashboard = dashboard.set('widgets', widgets); + + // this.computeHeightWithWidgets(widgets); + + // this.setState({ dashboard: selectedDashboards, project: null }); + + // AppDispatcher.dispatch({ + // type: 'projects/start-load', + // data: selectedDashboard.get('project'), + // token: this.state.sessionToken + // }); + + } + let simulationModels = []; if (prevState.simulation != null) { simulationModels = SimulationModelStore.getState().filter(m => prevState.simulation.models.includes(m._id)); } return { + dashboard, + sessionToken: UserStore.getState().token, - dashboards: DashboardStore.getState(), projects: ProjectStore.getState(), simulations: SimulationStore.getState(), files: FileStore.getState(), - dashboard: prevState.dashboard || {}, project: prevState.project || null, simulation: prevState.simulation || null, simulationModels, @@ -81,20 +107,30 @@ class Dashboard extends React.Component { modalIndex: prevState.modalIndex || null, maxWidgetHeight: prevState.maxWidgetHeight || 0, - dropZoneHeight: prevState.dropZoneHeight || 0 + dropZoneHeight: prevState.dropZoneHeight || 0, }; + } - componentWillMount() { - // TODO: Don't fetch token from local, use user-store! - const token = localStorage.getItem('token'); + static getNewWidgetKey() { + const widgetKey = this.lastWidgetKey; + this.lastWidgetKey++; + return widgetKey; + } + + + componentWillMount() { //document.addEventListener('keydown', this.handleKeydown.bind(this)); - AppDispatcher.dispatch({ - type: 'dashboards/start-load', - token - }); + if (this.state.dashboard.has('id') === false) { + AppDispatcher.dispatch({ + type: 'dashboards/start-load', + data: this.props.match.params.dashboard, + token: this.state.sessionToken + }); + } + } componentWillUnmount() { @@ -149,12 +185,24 @@ class Dashboard extends React.Component { } }*/ - transformToWidgetsDict(widgets) { - var widgetsDict = {}; - // Create a new key and make a copy of the widget object - var key = 0; - widgets.forEach( (widget) => widgetsDict[key++] = Object.assign({}, widget) ); - return widgetsDict; + /* + * Adapt the area's height with the position of the new widget. + * Return true if the height increased, otherwise false. + */ + increaseHeightWithWidget(widget) { + let increased = false; + let thisWidgetHeight = widget.y + widget.height; + + if (thisWidgetHeight > this.state.maxWidgetHeight) { + increased = true; + + this.setState({ + maxWidgetHeight: thisWidgetHeight, + dropZoneHeight: thisWidgetHeight + 40 + }); + } + + return increased; } transformToWidgetsList(widgets) { @@ -186,64 +234,40 @@ class Dashboard extends React.Component { }); } - snapToGrid(value) { - if (this.state.dashboard.grid === 1) return value; + handleDrop = widget => { + const widgets = this.state.dashboard.get('widgets') || []; - return Math.round(value / this.state.dashboard.grid) * this.state.dashboard.grid; - } + const widgetKey = this.getNewWidgetKey(); + widgets[widgetKey] = widget; - handleDrop(item, position) { + const dashboard = this.state.dashboard.set('widgets'); - let widget = null; - let defaultSimulationModel = null; + // this.increaseHeightWithWidget(widget); - if (this.state.simulation.models && this.state.simulation.models.length === 0) { - NotificationsDataManager.addNotification(NotificationsFactory.NO_SIM_MODEL_AVAILABLE); - } else { - defaultSimulationModel = this.state.simulation.models[0]; - } + this.setState({ dashboard }); + }; - // snap position to grid - position.x = this.snapToGrid(position.x); - position.y = this.snapToGrid(position.y); - - // create new widget - widget = WidgetFactory.createWidgetOfType(item.name, position, defaultSimulationModel); - - var new_widgets = this.state.dashboard.widgets; - var new_key = Object.keys(new_widgets).length; - - new_widgets[new_key] = widget; - - var dashboard = Object.assign({}, this.state.dashboard, { - widgets: new_widgets - }); - - this.increaseHeightWithWidget(widget); - this.setState({ dashboard: dashboard }); - } widgetStatusChange(updated_widget, key) { // Widget changed internally, make changes effective then save them this.widgetChange(updated_widget, key, this.saveChanges); } - widgetChange(updated_widget, key, callback = null) { - var widgets_update = {}; - widgets_update[key] = updated_widget; - var new_widgets = Object.assign({}, this.state.dashboard.widgets, widgets_update); + widgetChange = (widget, index, callback = null) => { + const widgets = this.state.dashboard.get('widgets'); + widgets[index] = widget; - var dashboard = Object.assign({}, this.state.dashboard, { - widgets: new_widgets - }); + const dashboard = this.state.dashboard.set('widgets'); // Check if the height needs to be increased, the section may have shrunk if not - if (!this.increaseHeightWithWidget(updated_widget)) { + if (!this.increaseHeightWithWidget(widget)) { this.computeHeightWithWidgets(dashboard.widgets); } - this.setState({ dashboard: dashboard }, callback); + + this.setState({ dashboard }, callback); } + /* * Set the initial height state based on the existing widgets */ @@ -261,289 +285,137 @@ class Dashboard extends React.Component { dropZoneHeight: maxHeight + 80 }); } - /* - * Adapt the area's height with the position of the new widget. - * Return true if the height increased, otherwise false. - */ - increaseHeightWithWidget(widget) { - let increased = false; - let thisWidgetHeight = widget.y + widget.height; - if (thisWidgetHeight > this.state.maxWidgetHeight) { - increased = true; - this.setState({ - maxWidgetHeight: thisWidgetHeight, - dropZoneHeight: thisWidgetHeight + 40 - }); - } - return increased; + + + editWidget = (widget, index) => { + this.setState({ editModal: true, modalData: widget, modalIndex: index }); } - editWidget(e, data) { - this.setState({ editModal: true, modalData: this.state.dashboard.widgets[data.key], modalIndex: data.key }); - } - closeEdit(data) { - if (data) { - // save changes temporarily - var widgets_update = {}; - widgets_update[this.state.modalIndex] = data; - - var new_widgets = Object.assign({}, this.state.dashboard.widgets, widgets_update); - - var dashboard = Object.assign({}, this.state.dashboard, { - widgets: new_widgets - }); - - this.setState({ editModal: false, dashboard: dashboard }); - } else { + closeEdit = data => { + if (data == null) { this.setState({ editModal: false }); + + return; } - } - deleteWidget(e, data) { - delete this.state.dashboard.widgets[data.key]; - var dashboard = Object.assign({}, this.state.dashboard, { - widgets: this.state.dashboard.widgets - }); - this.setState({ dashboard: dashboard }); - } + const widgets = this.state.dashboard.get('widgets'); + widgets[this.state.modalIndex] = data; - stopEditing() { + const dashboard = this.state.dashboard.set('widgets', widgets); + + this.setState({ editModal: false, dashboard }); + }; + + + deleteWidget = (widget, index) => { + const widgets = this.state.dashboard.get('widgets'); + delete widgets[index]; + + const dashboard = this.state.dashboard.set('widgets'); + + this.setState({ dashboard }); + }; + + + startEditing = () => { + this.setState({ editing: true }); + }; + + saveEditing = () => { // Provide the callback so it can be called when state change is applied + // TODO: Check if callback is needed this.setState({ editing: false }, this.saveChanges ); - } + }; saveChanges() { // Transform to a list - var dashboard = Object.assign({}, this.state.dashboard, { - widgets: this.transformToWidgetsList(this.state.dashboard.widgets) + const dashboard = Object.assign({}, this.state.dashboard.toJS(), { + widgets: this.transformToWidgetsList(this.state.dashboard.get('widgets')) }); - const token = localStorage.getItem('token'); - AppDispatcher.dispatch({ type: 'dashboards/start-edit', data: dashboard, - token + token: this.state.sessionToken }); } - discardChanges() { - this.setState({ editing: false, dashboard: {} }); + cancelEditing = () => { + this.setState({ editing: false, dasboard: {} }); this.reloadDashboard(); - } + }; - moveWidget(e, data, applyDirection) { - var widget = this.state.dashboard.widgets[data.key]; - var updated_widgets = {}; - updated_widgets[data.key] = applyDirection(widget); - var new_widgets = Object.assign({}, this.state.dashboard.widgets, updated_widgets); - - var dashboard = Object.assign({}, this.state.dashboard, { - widgets: new_widgets - }); - - this.setState({ dashboard: dashboard }); - } - - moveAbove(widget) { - // increase z-Order - widget.z++; - return widget; - } - - moveToFront(widget) { - // increase z-Order - widget.z = 100; - return widget; - } - - moveUnderneath(widget) { - // decrease z-Order - widget.z--; - if (widget.z < 0) { - widget.z = 0; - } - return widget; - } - - moveToBack(widget) { - // increase z-Order - widget.z = 0; - return widget; - } - - setGrid(value) { - // value 0 would block all widgets, set 1 as 'grid disabled' - if (value === 0) { - value = 1; - } - - let dashboard = Object.assign({}, this.state.dashboard, { - grid: value - }); + setGrid = value => { + const dashboard = this.state.dashboard.set('grid', value); this.setState({ dashboard }); - } - - lockWidget(data) { - // lock the widget - let widget = this.state.dashboard.widgets[data.key]; - widget.locked = true; - - // update dashboard - let widgets = {}; - widgets[data.key] = widget; - widgets = Object.assign({}, this.state.dashboard.widgets, widgets); - - const dashboard = Object.assign({}, this.state.dashboard, { widgets }); - this.setState({ dashboard }); - } - - unlockWidget(data) { - // lock the widget - let widget = this.state.dashboard.widgets[data.key]; - widget.locked = false; - - // update dashboard - let widgets = {}; - widgets[data.key] = widget; - widgets = Object.assign({}, this.state.dashboard.widgets, widgets); - - const dashboard = Object.assign({}, this.state.dashboard, { widgets }); - this.setState({ dashboard }); - } + }; pauseData = () => { this.setState({ paused: true }); - } + }; unpauseData = () => { this.setState({ paused: false }); - } + }; + render() { - const current_widgets = this.state.dashboard.widgets; + const widgets = this.state.dashboard.get('widgets'); + const grid = this.state.dashboard.get('grid'); - let boxClasses = classNames('section', 'box', { 'fullscreen-container': this.props.isFullscreen }); + const boxClasses = classNames('section', 'box', { 'fullscreen-padding': this.props.isFullscreen }); - let buttons = [] - let editingControls = []; - let gridControl = {}; - - if (this.state.editing) { - buttons.push({ click: () => this.stopEditing(), icon: 'save', text: 'Save' }); - buttons.push({ click: () => this.discardChanges(), icon: 'ban', text: 'Cancel' }); - - gridControl =
    - Grid: {this.state.dashboard.grid > 1 ? this.state.dashboard.grid : 'Disabled'} - this.setGrid(value)} /> -
    - } - - if (!this.props.isFullscreen) { - buttons.push({ click: this.props.toggleFullscreen, icon: 'expand', text: 'Fullscreen' }); - buttons.push({ click: this.state.paused ? this.unpauseData : this.pauseData, icon: this.state.paused ? 'play' : 'pause', text: this.state.paused ? 'Live' : 'Pause' }); - - if (!this.state.editing) - buttons.push({ click: () => this.setState({ editing: true }), icon: 'edit', text: 'Edit' }); - } - - const buttonList = buttons.map((btn, idx) => - - ); - - // Only one topology widget at the time is supported - let thereIsTopologyWidget = current_widgets && Object.values(current_widgets).filter( widget => widget.type === 'Topology').length > 0; - let topologyItemMsg = !thereIsTopologyWidget? '' : 'Currently only one is supported'; - - return ( -
    -
    -
    - {this.state.dashboard.name} -
    - -
    - { this.state.editing && gridControl } - { buttonList } -
    + return
    +
    +
    + {this.state.dashboard.get('name')}
    -
    e.preventDefault() }> - {this.state.editing && -
    - - { editingControls } - - - - - - - - - - - - - - - - - - - -
    - } - - this.handleDrop(item, position)} editing={this.state.editing}> - {current_widgets != null && - Object.keys(current_widgets).map(widget_key => ( - this.widgetChange(w, k)} - onWidgetStatusChange={(w, k) => this.widgetStatusChange(w, k)} - editing={this.state.editing} - index={widget_key} - grid={this.state.dashboard.grid} - paused={this.state.paused} - /> - ))} - - - - - {current_widgets != null && - Object.keys(current_widgets).map(widget_key => { - const data = { key: widget_key }; - - const locked = this.state.dashboard.widgets[widget_key].locked; - const disabledMove = locked || this.state.dashboard.widgets[widget_key].type === 'Box'; - - return - this.editWidget(e, data)}>Edit - this.deleteWidget(e, data)}>Delete - - this.moveWidget(e, data, this.moveAbove)}>Move above - this.moveWidget(e, data, this.moveToFront)}>Move to front - this.moveWidget(e, data, this.moveUnderneath)}>Move underneath - this.moveWidget(e, data, this.moveToBack)}>Move to back - - this.lockWidget(data)}>Lock - this.unlockWidget(data)}>Unlock - - })} - - this.closeEdit(data)} widget={this.state.modalData} simulationModels={this.state.simulationModels} files={this.state.files} /> -
    +
    - ); + +
    e.preventDefault() }> + {this.state.editing && + + } + + + {widgets != null && Object.keys(widgets).map(widgetKey => ( + this.widgetChange(w, k)} + onWidgetStatusChange={(w, k) => this.widgetStatusChange(w, k)} + editing={this.state.editing} + index={widgetKey} + grid={grid} + paused={this.state.paused} + /> + ))} + + + {/* TODO: Create only one context menu for all widgets */} + {widgets != null && Object.keys(widgets).map(widgetKey => ( + + ))} + + +
    +
    ; } } diff --git a/src/dashboard/widget-area.js b/src/dashboard/widget-area.js new file mode 100644 index 0000000..cc08afc --- /dev/null +++ b/src/dashboard/widget-area.js @@ -0,0 +1,78 @@ +/** + * File: widget-area.js + * Author: Markus Grigull + * Date: 31.05.2018 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import PropTypes from 'prop-types'; + +import Dropzone from './dropzone'; +import Grid from './grid'; + +import WidgetFactory from '../widget/widget-factory'; + +class WidgetArea extends React.Component { + snapToGrid(value) { + if (this.props.grid === 1) { + return value; + } + + return Math.round(value / this.props.grid) * this.props.grid; + } + + handleDrop = (item, position) => { + position.x = this.snapToGrid(position.x); + position.y = this.snapToGrid(position.y); + + const widget = WidgetFactory.createWidgetOfType(item.name, position, this.props.defaultSimulationModel); + + if (this.props.onWidgetAdded != null) { + this.props.onWidgetAdded(widget); + } + } + + render() { + const maxHeight = Object.values(this.props.widgets).reduce((currentHeight, widget) => { + const absolutHeight = widget.y + widget.height; + + return absolutHeight > currentHeight ? absolutHeight : currentHeight; + }, 0); + + return + {this.props.children} + + + ; + } +} + +WidgetArea.propTypes = { + children: PropTypes.node, //TODO is .node correct here? Was .children before leading to compile error + editing: PropTypes.bool, + grid: PropTypes.number, + defaultSimulationModel: PropTypes.string, + widgets: PropTypes.object, + onWidgetAdded: PropTypes.func +}; + +WidgetArea.defaultProps = { + widgets: {} +}; + +export default WidgetArea; diff --git a/src/dashboard/widget-context-menu.js b/src/dashboard/widget-context-menu.js new file mode 100644 index 0000000..69e0683 --- /dev/null +++ b/src/dashboard/widget-context-menu.js @@ -0,0 +1,123 @@ +/** + * File: widget-context-menu.js + * Author: Markus Grigull + * Date: 31.05.2018 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import PropTypes from 'prop-types'; +import { contextMenu, Item, Separator } from 'react-contexify'; + +class WidgetContextMenu extends React.Component { + editWidget = event => { + if (this.props.onEdit != null) { + this.props.onEdit(this.props.widget, this.props.index); + } + }; + + deleteWidget = event => { + if (this.props.onDelete != null) { + this.props.onDelete(this.props.widget, this.props.index); + } + }; + + moveAbove = event => { + this.props.widget.z++; + if (this.props.widget.z > 100) { + this.props.widget.z = 100; + } + + if (this.props.onChange != null) { + this.props.onChange(this.props.widget, this.props.index); + } + }; + + moveToFront = event => { + this.props.widget.z = 100; + + if (this.props.onChange != null) { + this.props.onChange(this.props.widget, this.props.index); + } + }; + + moveUnderneath = event => { + this.props.widget.z--; + if (this.props.widget.z < 0) { + this.props.widget.z = 0; + } + + if (this.props.onChange != null) { + this.props.onChange(this.props.widget, this.props.index); + } + }; + + moveToBack = event => { + this.props.widget.z = 0; + + if (this.props.onChange != null) { + this.props.onChange(this.props.widget, this.props.index); + } + }; + + lockWidget = event => { + this.props.widget.locked = true; + + if (this.props.onChange != null) { + this.props.onChange(this.props.widget, this.props.index); + } + }; + + unlockWidget = event => { + this.props.widget.locked = false; + + if (this.props.onChange != null) { + this.props.onChange(this.props.widget, this.props.index); + } + }; + + render() { + const isLocked = this.props.widget.locked; + + return + Edit + Delete + + + + Move above + Move to front + Move underneath + Move to back + + + + Lock + Unlock + ; + } +} + +WidgetContextMenu.propTypes = { + index: PropTypes.number.isRequired, + widget: PropTypes.object.isRequired, + onEdit: PropTypes.func, + onDelete: PropTypes.func, + onChange: PropTypes.func +}; + +export default WidgetContextMenu diff --git a/src/dashboard/widget-toolbox.js b/src/dashboard/widget-toolbox.js new file mode 100644 index 0000000..9799ff5 --- /dev/null +++ b/src/dashboard/widget-toolbox.js @@ -0,0 +1,77 @@ +/** + * File: widget-toolbox.js + * Author: Markus Grigull + * Date: 31.05.2018 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import PropTypes from 'prop-types'; +import Slider from 'rc-slider'; + +import ToolboxItem from './toolbox-item'; + +class WidgetToolbox extends React.Component { + onGridChange = value => { + // value 0 would block all widgets, set 1 as 'grid disabled' + if (value === 0) { + value = 1; + } + + if (this.props.onGridChange != null) { + this.props.onGridChange(value); + } + }; + + render() { + // Only one topology widget at the time is supported + const thereIsTopologyWidget = this.props.widgets != null && Object.values(this.props.widgets).filter(w => w.type === 'Topology').length > 0; + const topologyItemMsg = thereIsTopologyWidget? 'Currently only one is supported' : ''; + + return
    + + + + + + + + + + + + + + + +
    +
    + Grid: { this.props.grid > 1 ? this.props.grid : 'Disabled' } + +
    +
    +
    ; + }; +} + +WidgetToolbox.propTypes = { + widgets: PropTypes.array, + grid: PropTypes.number, + onGridChange: PropTypes.func +}; + +export default WidgetToolbox; diff --git a/src/widget/editable-widget-container.js b/src/widget/editable-widget-container.js new file mode 100644 index 0000000..db5e828 --- /dev/null +++ b/src/widget/editable-widget-container.js @@ -0,0 +1,142 @@ +/** + * File: editable-widget-container.js + * Author: Markus Grigull + * Date: 31.05.2018 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import PropTypes from 'prop-types'; +import classNames from 'classnames'; +import { Rnd } from 'react-rnd'; +import { contextMenu } from 'react-contexify'; + +class EditableWidgetContainer extends React.Component { + constructor(props) { + super(props); + + this.rnd = null; + } + + snapToGrid(value) { + if (this.props.grid === 1) { + return value; + } + + return Math.round(value / this.props.grid) * this.props.grid; + } + + borderWasClicked = event => { + if (event.button !== 2) { + return; + } + }; + + drag = (event, data) => { + const x = this.snapToGrid(data.x); + const y = this.snapToGrid(data.y); + + if (x !== data.x || y !== data.y) { + this.rnd.updatePosition({ x, y }); + } + }; + + dragStop = (event, data) => { + const widget = this.props.widget; + + widget.x = this.snapToGrid(data.x); + widget.y = this.snapToGrid(data.y); + + if (this.props.onWidgetChange != null) { + this.props.onWidgetChange(widget, this.props.index); + } + }; + + resizeStop = (direction, delta, ref, event) => { + const widget = this.props.widget; + + // resize depends on direction + if (direction === 'left' || direction === 'topLeft' || direction === 'bottomLeft') { + widget.x -= delta.width; + } + + if (direction === 'top' || direction === 'topLeft' || direction === 'topRight') { + widget.y -= delta.height; + } + + widget.width += delta.width; + widget.height += delta.height; + + if (this.props.onWidgetChange != null) { + this.props.onWidgetChange(widget, this.props.index); + } + }; + + render() { + const widget = this.props.widget; + + const resizing = { + bottom: !widget.locked, + bottomLeft: !widget.locked, + bottomRight: !widget.locked, + left: !widget.locked, + right: !widget.locked, + top: !widget.locked, + topLeft: !widget.locked, + topRight: !widget.locked + }; + + const gridArray = [ this.props.grid, this.props.grid ]; + + const widgetClasses = classNames({ + 'editing-widget': true, + 'locked': widget.locked + }); + + return { this.rnd = c; }} + default={{ x: Number(widget.x), y: Number(widget.y), width: widget.width, height: widget.height }} + minWidth={widget.minWidth} + minHeight={widget.minHeight} + lockAspectRatio={Boolean(widget.lockAspect)} + bounds={'parent'} + className={widgetClasses} + onResizeStart={this.borderWasClicked} + onResizeStop={this.resizeStop} + onDrag={this.drag} + onDragStop={this.dragStop} + dragGrid={gridArray} + resizeGrid={gridArray} + zIndex={widget.z} + enableResizing={resizing} + disableDragging={widget.locked} + > + + {this.props.children} + + ; + } +} + +EditableWidgetContainer.propTypes = { + widget: PropTypes.object.isRequired, + index: PropTypes.number.isRequired, + grid: PropTypes.number, + onWidgetChange: PropTypes.func +}; + +export default EditableWidgetContainer diff --git a/src/widget/widget-container.js b/src/widget/widget-container.js new file mode 100644 index 0000000..4aa62a5 --- /dev/null +++ b/src/widget/widget-container.js @@ -0,0 +1,47 @@ +/** + * File: widget-container.js + * Author: Markus Grigull + * Date: 31.05.2018 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import PropTypes from 'prop-types'; + +class WidgetContainer extends React.Component { + render() { + const containerStyle = { + width: Number(this.props.widget.width), + height: Number(this.props.widget.height), + left: Number(this.props.widget.x), + top: Number(this.props.widget.y), + zIndex: Number(this.props.widget.z), + position: 'absolute' + }; + + return
    + {this.props.children} +
    ; + } +} + +WidgetContainer.propTypes = { + widget: PropTypes.object.isRequired, + children: PropTypes.node, //TODO is .node correct here? Was .children before leading to compile error +}; + +export default WidgetContainer diff --git a/src/widget/widget.js b/src/widget/widget.js index cb9944e..4513cf7 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -21,9 +21,6 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { ContextMenuProvider } from 'react-contexify'; -import { Rnd } from 'react-rnd'; -import classNames from 'classnames'; import AppDispatcher from '../common/app-dispatcher'; import UserStore from '../user/user-store'; @@ -31,6 +28,9 @@ import SimulatorDataStore from '../simulator/simulator-data-store'; import SimulationModelStore from '../simulationmodel/simulation-model-store'; import FileStore from '../file/file-store'; +import EditableWidgetContainer from './editable-widget-container'; +import WidgetContainer from './widget-container'; + import WidgetCustomAction from './widgets/custom-action'; import WidgetAction from './widgets/action'; import WidgetLamp from './widgets/lamp'; @@ -56,8 +56,6 @@ class Widget extends React.Component { } static calculateState(prevState, props) { - const sessionToken = UserStore.getState().token; - let simulatorData = {}; if (props.paused) { @@ -68,101 +66,32 @@ class Widget extends React.Component { simulatorData = SimulatorDataStore.getState(); } - if (prevState) { - return { - sessionToken, - simulatorData, - files: FileStore.getState(), - sequence: prevState.sequence + 1, + return { + simulatorData, + files: FileStore.getState(), + simulationModels: SimulationModelStore.getState(), - simulationModels: SimulationModelStore.getState() - }; - } else { - return { - sessionToken, - simulatorData, - files: FileStore.getState(), - sequence: 0, + sequence: prevState != null ? prevState.sequence + 1 : 0, - simulationModels: SimulationModelStore.getState() - }; - } - } - - constructor(props) { - super(props); - - // Reference to the context menu element - this.contextMenuTriggerViaDraggable = null; + sessionToken: UserStore.getState().token + }; } componentWillMount() { - // If loading for the first time - if (this.state.sessionToken) { - AppDispatcher.dispatch({ - type: 'files/start-load', - token: this.state.sessionToken - }); - - AppDispatcher.dispatch({ - type: 'simulationModels/start-load', - token: this.state.sessionToken - }); - } - } - - snapToGrid(value) { - if (this.props.grid === 1) - return value; - - return Math.round(value / this.props.grid) * this.props.grid; - } - - drag(event, data) { - const x = this.snapToGrid(data.x); - const y = this.snapToGrid(data.y); - - if (x !== data.x || y !== data.y) { - this.rnd.updatePosition({ x, y }); - } - } - - dragStop(event, data) { - // update widget - let widget = this.props.data; - widget.x = this.snapToGrid(data.x); - widget.y = this.snapToGrid(data.y); - - this.props.onWidgetChange(widget, this.props.index); - } - - resizeStop(direction, delta, event) { - // update widget - let widget = Object.assign({}, this.props.data); - - // resize depends on direction - if (direction === 'left' || direction === 'topLeft' || direction === 'bottomLeft') { - widget.x -= delta.width; + if (this.state.sessionToken == null) { + return; } - if (direction === 'top' || direction === 'topLeft' || direction === 'topRight') { - widget.y -= delta.height; - } + AppDispatcher.dispatch({ + type: 'files/start-load', + token: this.state.sessionToken + }); - widget.width += delta.width; - widget.height += delta.height; + AppDispatcher.dispatch({ + type: 'simulationModels/start-load', + token: this.state.sessionToken + }); - this.props.onWidgetChange(widget, this.props.index); - } - - borderWasClicked(e) { - // check if it was triggered by the right button - if (e.button === 2) { - // launch the context menu using the reference - if(this.contextMenuTriggerViaDraggable) { - this.contextMenuTriggerViaDraggable.handleContextClick(e); - } - } } inputDataChanged(widget, data) { @@ -184,16 +113,7 @@ class Widget extends React.Component { }); } - render() { - // configure grid - const grid = [this.props.grid, this.props.grid]; - - // get widget element - const widget = this.props.data; - let borderedWidget = false; - let element = null; - let zIndex = Number(widget.z); - + createWidget(widget) { let simulationModel = null; for (let model of this.state.simulationModels) { @@ -204,93 +124,56 @@ class Widget extends React.Component { simulationModel = model; } - // dummy is passed to widgets to keep updating them while in edit mode if (widget.type === 'CustomAction') { - element = + return } else if (widget.type === 'Action') { - element = + return } else if (widget.type === 'Lamp') { - element = + return } else if (widget.type === 'Value') { - element = + return } else if (widget.type === 'Plot') { - element = + return } else if (widget.type === 'Table') { - element = + return } else if (widget.type === 'Label') { - element = + return } else if (widget.type === 'PlotTable') { - element = this.props.onWidgetStatusChange(w, this.props.index)} paused={this.props.paused} /> + return this.props.onWidgetStatusChange(w, this.props.index)} paused={this.props.paused} /> } else if (widget.type === 'Image') { - element = + return } else if (widget.type === 'Button') { - element = this.inputDataChanged(widget, value)} /> - } else if (widget.type === 'Input') { - element = this.inputDataChanged(widget, value)} /> + return this.inputDataChanged(widget, value)} /> + } else if (widget.type === 'NumberInput') { + return this.inputDataChanged(widget, value)} /> } else if (widget.type === 'Slider') { - element = this.inputDataChanged(widget, value)} onWidgetChange={(w) => this.props.onWidgetStatusChange(w, this.props.index) } /> + return this.props.onWidgetStatusChange(w, this.props.index) } onInputChanged={value => this.inputDataChanged(widget, value)} /> } else if (widget.type === 'Gauge') { - element = + return } else if (widget.type === 'Box') { - element = + return } else if (widget.type === 'HTML') { - element = + return } else if (widget.type === 'Topology') { - element = + return } - if (widget.type === 'Box') - zIndex = 0; + return null; + } - const widgetClasses = classNames({ - 'widget': !this.props.editing, - 'editing-widget': this.props.editing, - 'border': borderedWidget, - 'unselectable': false, - 'locked': widget.locked && this.props.editing - }); + + render() { + const element = this.createWidget(this.props.data); if (this.props.editing) { - const resizing = { bottom: !widget.locked, bottomLeft: !widget.locked, bottomRight: !widget.locked, left: !widget.locked, right: !widget.locked, top: !widget.locked, topLeft: !widget.locked, topRight: !widget.locked}; - - return ( - { this.rnd = c; }} - default={{ x: Number(widget.x), y: Number(widget.y), width: widget.width, height: widget.height }} - minWidth={widget.minWidth} - minHeight={widget.minHeight} - lockAspectRatio={Boolean(widget.lockAspect)} - bounds={'parent'} - className={ widgetClasses } - onResizeStart={(event, direction, ref) => this.borderWasClicked(event)} - onResizeStop={(event, direction, ref, delta) => this.resizeStop(direction, delta, event)} - onDrag={(event, data) => this.drag(event, data)} - onDragStop={(event, data) => this.dragStop(event, data)} - dragGrid={grid} - resizeGrid={grid} - z={zIndex} - enableResizing={resizing} - disableDragging={widget.locked} - > - - {element} - - - ); - } else { - return ( -
    - {element} -
    - ); + return + {element} + ; } + + return + {element} + ; } }