diff --git a/package-lock.json b/package-lock.json index d1c1633..807685b 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,19 @@ } }, "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.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.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": { "version": "1.0.0", @@ -5217,38 +5328,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 +5386,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 +5419,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 +5503,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 +5525,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 +5560,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 +5570,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 +5611,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 +5642,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 +5699,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 +5826,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 +5891,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 +6026,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", @@ -5910,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", @@ -5991,11 +6136,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 +6164,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 +6198,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 +6313,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 +6330,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 +6408,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 +6449,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 +6497,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 +6507,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 +6517,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 +6527,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 +6615,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 +6742,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 +7068,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 +7111,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 +7936,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 +8002,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 +8044,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 +8088,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 +8107,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 +8123,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 +8183,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 +8285,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 +8322,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 +8350,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 +8382,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 +8473,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 +8538,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 +8583,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 +8605,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 +8666,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 +8729,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 +8753,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 +8812,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 +8831,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 +8845,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 +8857,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 +8892,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 +8980,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 +9115,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 +9294,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 +9309,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 +9345,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 +9386,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 +9484,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 +9520,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 +9678,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 +9838,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 +9857,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 +10384,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 +10407,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 +10423,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 +10459,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 +10542,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 +10572,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 +10601,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 +10639,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 +10675,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 +10719,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 +10738,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 +10814,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 +10868,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,15 +10918,23 @@ "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", "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", @@ -10980,47 +10966,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 +11112,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 +11260,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 +11287,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 +11304,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 +11346,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 +11413,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 +11479,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 +11567,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 +11703,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 +11748,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 +11759,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 +11773,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 +11821,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 +11871,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 +11897,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 +11921,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 +11991,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 +12198,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 +12222,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 +12252,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 +12330,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 +12474,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 +12521,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 +12552,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 +12676,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 +12736,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 +12759,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,24 +12827,51 @@ "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.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": { + "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": { @@ -12788,64 +12898,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 +12928,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 +13033,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 +13055,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 +13103,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 +13132,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 +13189,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 +13234,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 +13375,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 +13398,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 +13605,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 +13685,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 +13701,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..9ce2493 100644 --- a/package.json +++ b/package.json @@ -3,47 +3,52 @@ "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.5.1", + "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-grid-system": "^4.4.10", "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/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..fb5cfab 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/app.js b/src/app.js new file mode 100644 index 0000000..92bb42c --- /dev/null +++ b/src/app.js @@ -0,0 +1,174 @@ +/** + * File: app.js + * Author: Markus Grigull + * Date: 02.03.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 { Container } from 'flux/utils'; +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'; +import { Col } from 'react-bootstrap'; +import { Hidden } from 'react-grid-system' + +import AppDispatcher from './common/app-dispatcher'; +import ScenarioStore from './scenario/scenario-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 './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 './project/projects'; +//import Project from './project/project'; +import Simulators from './simulator/simulators'; +import Dashboard from './dashboard/dashboard'; +//import Simulations from './simulation/simulations'; +//import Simulation from './simulation/simulation'; +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'; + +class App extends React.Component { + + static getStores() { + return [ SimulatorStore, UserStore, ScenarioStore]; + } + + static calculateState(prevState) { + let currentUser = UserStore.getState().currentUser; + + return { + simulators: SimulatorStore.getState(), + scenarios: ScenarioStore.getState(), + currentRole: currentUser ? currentUser.role : '', + currentUsername: currentUser ? currentUser.username: '', + currentUserID: UserStore.getState().userid, + token: UserStore.getState().token, + + showSidebarMenu: false, + }; + } + + 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 + this.setState({ token }); + + AppDispatcher.dispatch({ + type: 'users/logged-in', + token: token, + userid: userid + }); + } + } + + componentDidMount() { + // load all simulators and scenarios to fetch data + AppDispatcher.dispatch({ + type: 'simulators/start-load', + token: this.state.token + }); + + AppDispatcher.dispatch({ + type: 'scenarios/start-load', + token: this.state.token + }); + + NotificationsDataManager.setSystem(this.refs.notificationSystem); + } + + showSidebarMenu = () => { + this.setState({ showSidebarMenu: true }); + }; + + hideSidebarMenu = () => { + this.setState({ showSidebarMenu: false }); + }; + + render() { + if (this.state.token == null) { + return (); + } + + return ( + +
+ {/* + + */} + + + + + + +
+ + +
+ +
+ + + + +
+ + + + + + + + + +
+
+ +
+
+
+
+ ) + } +} + +// Removed routes +// +// +// +// + +let fluxContainerConverter = require('./common/FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(App)); +//DragDropContext(HTML5Backend)(Container.create(App)); diff --git a/src/common/FluxContainerConverter.js b/src/common/FluxContainerConverter.js new file mode 100644 index 0000000..bd2196a --- /dev/null +++ b/src/common/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/api/rest-api.js b/src/common/api/rest-api.js similarity index 93% rename from src/api/rest-api.js rename to src/common/api/rest-api.js index 43af793..4fb5395 100644 --- a/src/api/rest-api.js +++ b/src/common/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/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 69% rename from src/stores/array-store.js rename to src/common/array-store.js index ccd9689..1d76845 100644 --- a/src/stores/array-store.js +++ b/src/common/array-store.js @@ -21,7 +21,8 @@ import { ReduceStore } from 'flux/utils'; -import AppDispatcher from '../app-dispatcher'; +import AppDispatcher from './app-dispatcher'; +import NotificationsDataManager from '../common/data-managers/notifications-data-manager'; class ArrayStore extends ReduceStore { constructor(type, dataManager) { @@ -39,7 +40,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)) { @@ -67,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); @@ -84,9 +86,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 +106,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,20 +120,41 @@ class ArrayStore extends ReduceStore { }); case this.type + '/remove-error': - // TODO: Add error message + 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; - case this.type + '/start-edit': + 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]); - 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/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 94% rename from src/data-managers/rest-data-manager.js rename to src/common/data-managers/rest-data-manager.js index dbd278e..b667ac0 100644 --- a/src/data-managers/rest-data-manager.js +++ b/src/common/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) { @@ -114,7 +114,7 @@ class RestDataManager { } remove(object, token = null) { - RestAPI.delete(this.makeURL(this.url + '/' + object._id), token).then(response => { + 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/components/dialogs/delete-dialog.js b/src/common/dialogs/delete-dialog.js similarity index 96% rename from src/components/dialogs/delete-dialog.js rename to src/common/dialogs/delete-dialog.js index 13ece5e..c69ad7c 100644 --- a/src/components/dialogs/delete-dialog.js +++ b/src/common/dialogs/delete-dialog.js @@ -43,7 +43,7 @@ class DeleteDialog extends React.Component { - + ; } 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 94% rename from src/components/header-menu.js rename to src/common/header-menu.js index b2daf0e..0273407 100644 --- a/src/components/header-menu.js +++ b/src/common/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/common/header.js similarity index 69% rename from src/components/header.js rename to src/common/header.js index 710ea9b..7d72e0c 100644 --- a/src/components/header.js +++ b/src/common/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/common/home.js similarity index 65% rename from src/components/home.js rename to src/common/home.js index 86ea56b..654ea6d 100644 --- a/src/components/home.js +++ b/src/common/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 "../user/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) { @@ -41,9 +49,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() { @@ -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('dashboards')} dashboards 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

      @@ -75,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/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 75% rename from src/components/menu-sidebar.js rename to src/common/menu-sidebar.js index 51d7d83..5f43425 100644 --- a/src/components/menu-sidebar.js +++ b/src/common/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,12 +33,12 @@ class SidebarMenu extends React.Component {
      • Home
      • -
      • Projects
      • -
      • Simulations
      • +
      • Scenarios
      • Simulators
      • - { this.props.currentRole === 'admin' ? -
      • Users
      • : '' + { this.props.currentRole === 'Admin' ? +
      • User Management
      • : '' } +
      • Account
      • Logout
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 95% rename from src/components/table-column.js rename to src/common/table-column.js index 1aafc2e..151e3eb 100644 --- a/src/components/table-column.js +++ b/src/common/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/common/table.js similarity index 89% rename from src/components/table.js rename to src/common/table.js index 0eaac85..8d2d33d 100644 --- a/src/components/table.js +++ b/src/common/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'; @@ -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( ); + cell.push( +   + + {labelContent.toString()} + + + ); } if (child.props.dataIndex) { @@ -98,21 +104,21 @@ 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) { const checkboxKey = this.props.checkboxKey; - cell.push( child.props.onChecked(index, e)} />); + cell.push( child.props.onChecked(index, e)} />); } if (child.props.exportButton) { - cell.push(); + cell.push(); } return cell; diff --git a/src/components/dialogs/edit-user.js b/src/components/dialogs/edit-user.js deleted file mode 100644 index e518b7d..0000000 --- a/src/components/dialogs/edit-user.js +++ /dev/null @@ -1,107 +0,0 @@ -/** - * 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, ControlLabel } from 'react-bootstrap'; - -import Dialog from './dialog'; - -class EditUserDialog extends React.Component { - valid: true; - - constructor(props) { - super(props); - - this.state = { - username: '', - mail: '', - role: '', - _id: '' - } - } - - onClose(canceled) { - if (canceled === false) { - if (this.valid) { - this.props.onClose(this.state); - } - } else { - this.props.onClose(); - } - } - - 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; - - if (this.state.username === '') { - username = false; - } - - this.valid = username; - - // return state to control - if (target === 'username') return username ? "success" : "error"; - - return "success"; - } - - render() { - return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> -
- - Username - this.handleChange(e)} /> - - - - E-mail - this.handleChange(e)} /> - - - Role - this.handleChange(e)}> - - - - - -
-
- ); - } -} - -export default EditUserDialog; 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' } } diff --git a/src/containers/app.js b/src/containers/app.js deleted file mode 100644 index 4199935..0000000 --- a/src/containers/app.js +++ /dev/null @@ -1,151 +0,0 @@ -/** - * File: app.js - * Author: Markus Grigull - * Date: 02.03.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 { Container } from 'flux/utils'; -import { DragDropContext } from 'react-dnd'; -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 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 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 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 '../styles/app.css'; - -class App extends React.Component { - static getStores() { - return [ SimulatorStore, UserStore, SimulationStore ]; - } - - static calculateState(prevState) { - let currentUser = UserStore.getState().currentUser; - - return { - simulators: SimulatorStore.getState(), - simulations: SimulationStore.getState(), - currentRole: currentUser ? currentUser.role : '', - token: UserStore.getState().token, - - showSidebarMenu: false, - }; - } - - componentWillMount() { - // if token stored locally, request user - const token = localStorage.getItem('token'); - - if (token != null && token !== '') { - // save token so we dont logout - this.setState({ token }); - - AppDispatcher.dispatch({ - type: 'users/logged-in', - token: token - }); - } - } - - componentDidMount() { - // load all simulators and simulations to fetch simulation data - AppDispatcher.dispatch({ - type: 'simulators/start-load', - token: this.state.token - }); - - AppDispatcher.dispatch({ - type: 'simulations/start-load', - token: this.state.token - }); - - NotificationsDataManager.setSystem(this.refs.notificationSystem); - } - - showSidebarMenu = () => { - this.setState({ showSidebarMenu: true }); - } - - hideSidebarMenu = () => { - this.setState({ showSidebarMenu: false }); - } - - render() { - if (this.state.token == null) { - return (); - } - - return ( -
- - - - -
- - -
- -
- - - - -
- - - - - - - - - - -
-
- -
-
-
- ); - } -} - -export default DragDropContext(HTML5Backend)(Container.create(App)); diff --git a/src/containers/visualization.js b/src/containers/visualization.js deleted file mode 100644 index a9e53ff..0000000 --- a/src/containers/visualization.js +++ /dev/null @@ -1,550 +0,0 @@ -/** - * File: visualization.js - * Author: Markus Grigull - * Date: 02.03.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 { 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 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 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 'react-contexify/dist/ReactContexify.min.css'; - -class Visualization extends React.Component { - static getStores() { - return [ VisualizationStore, ProjectStore, SimulationStore, SimulationModelStore, FileStore, UserStore ]; - } - - static calculateState(prevState, props) { - if (prevState == null) { - prevState = {}; - } - - let simulationModels = []; - if (prevState.simulation != null) { - simulationModels = SimulationModelStore.getState().filter(m => prevState.simulation.models.includes(m._id)); - } - - return { - sessionToken: UserStore.getState().token, - visualizations: VisualizationStore.getState(), - projects: ProjectStore.getState(), - simulations: SimulationStore.getState(), - files: FileStore.getState(), - - visualization: prevState.visualization || {}, - project: prevState.project || null, - simulation: prevState.simulation || null, - simulationModels, - editing: prevState.editing || false, - paused: prevState.paused || false, - - editModal: prevState.editModal || false, - modalData: prevState.modalData || null, - modalIndex: prevState.modalIndex || null, - - maxWidgetHeight: prevState.maxWidgetHeight || 0, - dropZoneHeight: prevState.dropZoneHeight || 0 - }; - } - - componentWillMount() { - // TODO: Don't fetch token from local, use user-store! - const token = localStorage.getItem('token'); - - //document.addEventListener('keydown', this.handleKeydown.bind(this)); - - AppDispatcher.dispatch({ - type: 'visualizations/start-load', - token - }); - } - - componentWillUnmount() { - //document.removeEventListener('keydown', this.handleKeydown.bind(this)); - } - - componentDidUpdate() { - if (this.state.visualization._id !== this.props.match.params.visualization) { - this.reloadVisualization(); - } - - // load depending project - if (this.state.project == null && this.state.projects) { - this.state.projects.forEach((project) => { - if (project._id === this.state.visualization.project) { - this.setState({ project: project, simulation: null }); - - const token = localStorage.getItem('token'); - - AppDispatcher.dispatch({ - type: 'simulations/start-load', - data: project.simulation, - token - }); - } - }); - } - - // load depending simulation - if (this.state.simulation == null && this.state.simulations && this.state.project) { - this.state.simulations.forEach((simulation) => { - if (simulation._id === this.state.project.simulation) { - this.setState({ simulation: simulation }); - } - }); - } - } - - /*handleKeydown(e) { - switch (e.key) { - case ' ': - case 'p': - this.setState({ paused: !this.state.paused }); - break; - case 'e': - this.setState({ editing: !this.state.editing }); - break; - case 'f': - this.props.toggleFullscreen(); - break; - default: - } - }*/ - - 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; - } - - transformToWidgetsList(widgets) { - 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) { - - // convert widgets list to a dictionary - var visualization = Object.assign({}, tempVisualization, { - widgets: tempVisualization.widgets ? this.transformToWidgetsDict(tempVisualization.widgets) : {} - }); - - this.computeHeightWithWidgets(visualization.widgets); - - this.setState({ visualization: visualization, project: null }); - - const token = localStorage.getItem('token'); - - AppDispatcher.dispatch({ - type: 'projects/start-load', - data: visualization.project, - token - }); - } - }); - } - - snapToGrid(value) { - if (this.state.visualization.grid === 1) return value; - - return Math.round(value / this.state.visualization.grid) * this.state.visualization.grid; - } - - handleDrop(item, position) { - - let widget = null; - let defaultSimulationModel = null; - - 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]; - } - - // 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.visualization.widgets; - var new_key = Object.keys(new_widgets).length; - - new_widgets[new_key] = widget; - - var visualization = Object.assign({}, this.state.visualization, { - widgets: new_widgets - }); - - this.increaseHeightWithWidget(widget); - this.setState({ visualization: visualization }); - } - - 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.visualization.widgets, widgets_update); - - var visualization = Object.assign({}, this.state.visualization, { - 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.setState({ visualization: visualization }, callback); - } - - /* - * Set the initial height state based on the existing widgets - */ - computeHeightWithWidgets(widgets) { - // Compute max height from widgets - let maxHeight = Object.keys(widgets).reduce( (maxHeightSoFar, widgetKey) => { - let thisWidget = widgets[widgetKey]; - let thisWidgetHeight = thisWidget.y + thisWidget.height; - - return thisWidgetHeight > maxHeightSoFar? thisWidgetHeight : maxHeightSoFar; - }, 0); - - this.setState({ - maxWidgetHeight: maxHeight, - 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(e, data) { - this.setState({ editModal: true, modalData: this.state.visualization.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.visualization.widgets, widgets_update); - - var visualization = Object.assign({}, this.state.visualization, { - widgets: new_widgets - }); - - this.setState({ editModal: false, visualization: visualization }); - } 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 - }); - this.setState({ visualization: visualization }); - } - - stopEditing() { - // Provide the callback so it can be called when state change is applied - this.setState({ editing: false }, this.saveChanges ); - } - - saveChanges() { - // Transform to a list - var visualization = Object.assign({}, this.state.visualization, { - widgets: this.transformToWidgetsList(this.state.visualization.widgets) - }); - - const token = localStorage.getItem('token'); - - AppDispatcher.dispatch({ - type: 'visualizations/start-edit', - data: visualization, - token - }); - } - - discardChanges() { - this.setState({ editing: false, visualization: {} }); - - this.reloadVisualization(); - } - - moveWidget(e, data, applyDirection) { - var widget = this.state.visualization.widgets[data.key]; - var updated_widgets = {}; - updated_widgets[data.key] = applyDirection(widget); - var new_widgets = Object.assign({}, this.state.visualization.widgets, updated_widgets); - - var visualization = Object.assign({}, this.state.visualization, { - widgets: new_widgets - }); - - this.setState({ visualization: visualization }); - } - - 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 visualization = Object.assign({}, this.state.visualization, { - grid: value - }); - - this.setState({ visualization }); - } - - lockWidget(data) { - // lock the widget - let widget = this.state.visualization.widgets[data.key]; - widget.locked = true; - - // update visualization - let widgets = {}; - widgets[data.key] = widget; - widgets = Object.assign({}, this.state.visualization.widgets, widgets); - - const visualization = Object.assign({}, this.state.visualization, { widgets }); - this.setState({ visualization }); - } - - unlockWidget(data) { - // lock the widget - let widget = this.state.visualization.widgets[data.key]; - widget.locked = false; - - // update visualization - let widgets = {}; - widgets[data.key] = widget; - widgets = Object.assign({}, this.state.visualization.widgets, widgets); - - const visualization = Object.assign({}, this.state.visualization, { widgets }); - this.setState({ visualization }); - } - - pauseData = () => { - this.setState({ paused: true }); - } - - unpauseData = () => { - this.setState({ paused: false }); - } - - render() { - const current_widgets = this.state.visualization.widgets; - - let boxClasses = classNames('section', 'box', { 'fullscreen-container': 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.visualization.grid > 1 ? this.state.visualization.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.visualization.name} -
- -
- { this.state.editing && gridControl } - { buttonList } -
-
- -
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.visualization.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'; - - 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} /> -
-
- ); - } -} - -export default Fullscreenable()(Container.create(Visualization, { withProps: true })); diff --git a/src/containers/widget.js b/src/containers/widget.js deleted file mode 100644 index b4df992..0000000 --- a/src/containers/widget.js +++ /dev/null @@ -1,297 +0,0 @@ -/** - * File: widget.js - * Author: Markus Grigull - * Date: 04.03.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 { Container } from 'flux/utils'; -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 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 '../styles/widgets.css'; - -class Widget extends React.Component { - static getStores() { - return [ SimulatorDataStore, SimulationModelStore, FileStore, UserStore ]; - } - - static calculateState(prevState, props) { - const sessionToken = UserStore.getState().token; - - let simulatorData = {}; - - if (props.paused) { - if (prevState && prevState.simulatorData) { - simulatorData = JSON.parse(JSON.stringify(prevState.simulatorData)); - } - } else { - simulatorData = SimulatorDataStore.getState(); - } - - if (prevState) { - return { - sessionToken, - simulatorData, - files: FileStore.getState(), - sequence: prevState.sequence + 1, - - simulationModels: SimulationModelStore.getState() - }; - } else { - return { - sessionToken, - simulatorData, - files: FileStore.getState(), - sequence: 0, - - simulationModels: SimulationModelStore.getState() - }; - } - } - - constructor(props) { - super(props); - - // Reference to the context menu element - this.contextMenuTriggerViaDraggable = null; - } - - 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 (direction === 'top' || direction === 'topLeft' || direction === 'topRight') { - widget.y -= delta.height; - } - - widget.width += delta.width; - widget.height += delta.height; - - 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) { - let simulationModel = null; - - for (let model of this.state.simulationModels) { - if (model._id !== widget.simulationModel) { - continue; - } - - simulationModel = model; - } - - AppDispatcher.dispatch({ - type: 'simulatorData/inputChanged', - simulator: simulationModel.simulator, - signal: widget.signal, - data - }); - } - - 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); - - let simulationModel = null; - - for (let model of this.state.simulationModels) { - if (model._id !== widget.simulationModel) { - continue; - } - - simulationModel = model; - } - - // dummy is passed to widgets to keep updating them while in edit mode - if (widget.type === 'CustomAction') { - element = - } else if (widget.type === 'Action') { - element = - } else if (widget.type === 'Lamp') { - element = - } else if (widget.type === 'Value') { - element = - } else if (widget.type === 'Plot') { - element = - } else if (widget.type === 'Table') { - element = - } else if (widget.type === 'Label') { - element = - } else if (widget.type === 'PlotTable') { - element = this.props.onWidgetStatusChange(w, this.props.index)} paused={this.props.paused} /> - } else if (widget.type === 'Image') { - element = - } else if (widget.type === 'Button') { - element = this.inputDataChanged(widget, value)} /> - } else if (widget.type === 'Input') { - element = this.inputDataChanged(widget, value)} /> - } else if (widget.type === 'Slider') { - element = this.inputDataChanged(widget, value)} onWidgetChange={(w) => this.props.onWidgetStatusChange(w, this.props.index) } /> - } else if (widget.type === 'Gauge') { - element = - } else if (widget.type === 'Box') { - element = - } else if (widget.type === 'HTML') { - element = - } else if (widget.type === 'Topology') { - element = - } - - if (widget.type === 'Box') - zIndex = 0; - - const widgetClasses = classNames({ - 'widget': !this.props.editing, - 'editing-widget': this.props.editing, - 'border': borderedWidget, - 'unselectable': false, - 'locked': widget.locked && this.props.editing - }); - - 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} -
- ); - } - } -} - -export default Container.create(Widget, { withProps: true }); 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/stores/visualization-store.js b/src/dashboard/dashboard-store.js similarity index 78% rename from src/stores/visualization-store.js rename to src/dashboard/dashboard-store.js index ba69682..28bb9cb 100644 --- a/src/stores/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 * @@ -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 DashboardsDataManager from './dashboards-data-manager'; -export default new ArrayStore('visualizations', VisualizationsDataManager); +export default new ArrayStore('dashboards', DashboardsDataManager); diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js new file mode 100644 index 0000000..80b5406 --- /dev/null +++ b/src/dashboard/dashboard.js @@ -0,0 +1,423 @@ +/** + * File: dashboard.js + * Author: Markus Grigull + * Date: 02.03.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 { Container } from 'flux/utils'; +import Fullscreenable from 'react-fullscreenable'; +import classNames from 'classnames'; +import { Map } from 'immutable' + +//import Icon from '../common/icon'; +import Widget from '../widget/widget'; +import EditWidget from '../widget/edit-widget'; + +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'; +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 'react-contexify/dist/ReactContexify.min.css'; + +class Dashboard extends React.Component { + + static lastWidgetKey = 0; + static getStores() { + return [ DashboardStore, ProjectStore, SimulationStore, SimulationModelStore, FileStore, UserStore ]; + } + + static calculateState(prevState, props) { + if (prevState == null) { + 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, + projects: ProjectStore.getState(), + simulations: SimulationStore.getState(), + files: FileStore.getState(), + + project: prevState.project || null, + simulation: prevState.simulation || null, + simulationModels, + editing: prevState.editing || false, + paused: prevState.paused || false, + + editModal: prevState.editModal || false, + modalData: prevState.modalData || null, + modalIndex: prevState.modalIndex || null, + + maxWidgetHeight: prevState.maxWidgetHeight || 0, + dropZoneHeight: prevState.dropZoneHeight || 0, + }; + + } + + static getNewWidgetKey() { + const widgetKey = this.lastWidgetKey; + this.lastWidgetKey++; + + return widgetKey; + } + + + componentWillMount() { + //document.addEventListener('keydown', this.handleKeydown.bind(this)); + + if (this.state.dashboard.has('id') === false) { + AppDispatcher.dispatch({ + type: 'dashboards/start-load', + data: this.props.match.params.dashboard, + token: this.state.sessionToken + }); + } + + } + + componentWillUnmount() { + //document.removeEventListener('keydown', this.handleKeydown.bind(this)); + } + + componentDidUpdate() { + 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.dashboard.project) { + this.setState({ project: project, simulation: null }); + + const token = localStorage.getItem('token'); + + AppDispatcher.dispatch({ + type: 'simulations/start-load', + data: project.simulation, + token + }); + } + }); + } + + // load depending simulation + if (this.state.simulation == null && this.state.simulations && this.state.project) { + this.state.simulations.forEach((simulation) => { + if (simulation._id === this.state.project.simulation) { + this.setState({ simulation: simulation }); + } + }); + } + } + + /*handleKeydown(e) { + switch (e.key) { + case ' ': + case 'p': + this.setState({ paused: !this.state.paused }); + break; + case 'e': + this.setState({ editing: !this.state.editing }); + break; + case 'f': + this.props.toggleFullscreen(); + break; + default: + } + }*/ + + /* + * 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) { + return Object.keys(widgets).map( (key) => widgets[key]); + } + + 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 dashboard = Object.assign({}, tempDashboard, { + widgets: tempDashboard.widgets ? this.transformToWidgetsDict(tempDashboard.widgets) : {} + }); + + this.computeHeightWithWidgets(dashboard.widgets); + + this.setState({ dashboard: dashboard, project: null }); + + const token = localStorage.getItem('token'); + + AppDispatcher.dispatch({ + type: 'projects/start-load', + data: dashboard.project, + token + }); + } + }); + } + + handleDrop = widget => { + const widgets = this.state.dashboard.get('widgets') || []; + + const widgetKey = this.getNewWidgetKey(); + widgets[widgetKey] = widget; + + const dashboard = this.state.dashboard.set('widgets'); + + // this.increaseHeightWithWidget(widget); + + this.setState({ dashboard }); + }; + + + widgetStatusChange(updated_widget, key) { + // Widget changed internally, make changes effective then save them + this.widgetChange(updated_widget, key, this.saveChanges); + } + + widgetChange = (widget, index, callback = null) => { + const widgets = this.state.dashboard.get('widgets'); + widgets[index] = widget; + + 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(widget)) { + this.computeHeightWithWidgets(dashboard.widgets); + } + + this.setState({ dashboard }, callback); + } + + + /* + * Set the initial height state based on the existing widgets + */ + computeHeightWithWidgets(widgets) { + // Compute max height from widgets + let maxHeight = Object.keys(widgets).reduce( (maxHeightSoFar, widgetKey) => { + let thisWidget = widgets[widgetKey]; + let thisWidgetHeight = thisWidget.y + thisWidget.height; + + return thisWidgetHeight > maxHeightSoFar? thisWidgetHeight : maxHeightSoFar; + }, 0); + + this.setState({ + maxWidgetHeight: maxHeight, + dropZoneHeight: maxHeight + 80 + }); + } + + + editWidget = (widget, index) => { + this.setState({ editModal: true, modalData: widget, modalIndex: index }); + } + + + closeEdit = data => { + if (data == null) { + this.setState({ editModal: false }); + + return; + } + + const widgets = this.state.dashboard.get('widgets'); + widgets[this.state.modalIndex] = data; + + 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 + const dashboard = Object.assign({}, this.state.dashboard.toJS(), { + widgets: this.transformToWidgetsList(this.state.dashboard.get('widgets')) + }); + + AppDispatcher.dispatch({ + type: 'dashboards/start-edit', + data: dashboard, + token: this.state.sessionToken + }); + } + + cancelEditing = () => { + this.setState({ editing: false, dasboard: {} }); + + this.reloadDashboard(); + }; + + setGrid = value => { + const dashboard = this.state.dashboard.set('grid', value); + + this.setState({ dashboard }); + }; + + pauseData = () => { + this.setState({ paused: true }); + }; + + unpauseData = () => { + this.setState({ paused: false }); + }; + + + render() { + const widgets = this.state.dashboard.get('widgets'); + const grid = this.state.dashboard.get('grid'); + + const boxClasses = classNames('section', 'box', { 'fullscreen-padding': this.props.isFullscreen }); + + return
+
+
+ {this.state.dashboard.get('name')} +
+ + +
+ +
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 => ( + + ))} + + +
+
; + } +} + +let fluxContainerConverter = require('../common/FluxContainerConverter'); +export default Fullscreenable()(Container.create(fluxContainerConverter.convert(Dashboard), { withProps: true })); diff --git a/src/data-managers/visualizations-data-manager.js b/src/dashboard/dashboards-data-manager.js similarity index 82% rename from src/data-managers/visualizations-data-manager.js rename to src/dashboard/dashboards-data-manager.js index b141880..a39e017 100644 --- a/src/data-managers/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 * @@ -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'); +export default new RestDataManager('dashboard', '/dashboards'); diff --git a/src/components/dropzone.js b/src/dashboard/dropzone.js similarity index 100% rename from src/components/dropzone.js rename to src/dashboard/dropzone.js diff --git a/src/components/dialogs/edit-visualization.js b/src/dashboard/edit-dashboard.js similarity index 78% rename from src/components/dialogs/edit-visualization.js rename to src/dashboard/edit-dashboard.js index ccd8578..1e2fdd6 100644 --- a/src/components/dialogs/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 * @@ -20,11 +20,11 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; +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,10 +75,10 @@ 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 + Name this.handleChange(e)} /> @@ -88,4 +88,4 @@ class EditVisualizationDialog extends React.Component { } } -export default EditVisualizationDialog; +export default EditDashboardDialog; diff --git a/src/components/grid.js b/src/dashboard/grid.js similarity index 100% rename from src/components/grid.js rename to src/dashboard/grid.js diff --git a/src/components/dialogs/import-visualization.js b/src/dashboard/import-dashboard.js similarity index 81% rename from src/components/dialogs/import-visualization.js rename to src/dashboard/import-dashboard.js index 5d276f9..8144193 100644 --- a/src/components/dialogs/import-visualization.js +++ b/src/dashboard/import-dashboard.js @@ -20,11 +20,11 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; +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,15 +115,15 @@ 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)} /> - Name + Name this.handleChange(e)} /> @@ -133,4 +133,4 @@ class ImportVisualizationDialog extends React.Component { } } -export default ImportVisualizationDialog; +export default ImportDashboardDialog; diff --git a/src/components/dialogs/new-visualization.js b/src/dashboard/new-dashboard.js similarity index 85% rename from src/components/dialogs/new-visualization.js rename to src/dashboard/new-dashboard.js index 70b45ec..cbac2cb 100644 --- a/src/components/dialogs/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 * @@ -20,9 +20,9 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; class NewVisualzationDialog extends React.Component { valid: false; @@ -71,10 +71,10 @@ 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 + Name this.handleChange(e)} /> diff --git a/src/components/toolbox-item.js b/src/dashboard/toolbox-item.js similarity index 98% rename from src/components/toolbox-item.js rename to src/dashboard/toolbox-item.js index a4f5b14..be498f4 100644 --- a/src/components/toolbox-item.js +++ b/src/dashboard/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/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/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 89% rename from src/containers/select-file.js rename to src/file/select-file.js index 755356d..fafe98f 100644 --- a/src/containers/select-file.js +++ b/src/file/select-file.js @@ -21,12 +21,12 @@ 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'; +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,21 +107,21 @@ 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' }; return
- + {this.props.name} - + {fileOptions} @@ -148,4 +148,5 @@ class SelectFile extends React.Component { } } -export default Container.create(SelectFile); +let fluxContainerConverter = require('../common/FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(SelectFile)); diff --git a/src/img/uel.png b/src/img/uel.png new file mode 100644 index 0000000..57dc0bd Binary files /dev/null and b/src/img/uel.png differ diff --git a/src/img/uel_efre.jpeg b/src/img/uel_efre.jpeg new file mode 100644 index 0000000..9887c54 Binary files /dev/null and b/src/img/uel_efre.jpeg differ diff --git a/src/components/dialogs/edit-project.js b/src/project/edit-project.js similarity index 93% rename from src/components/dialogs/edit-project.js rename to src/project/edit-project.js index 2b960b6..918633d 100644 --- a/src/components/dialogs/edit-project.js +++ b/src/project/edit-project.js @@ -20,9 +20,9 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; class EditProjectDialog extends React.Component { valid: true; @@ -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/new-project.js b/src/project/new-project.js similarity index 93% rename from src/components/dialogs/new-project.js rename to src/project/new-project.js index babcf77..c18cd89 100644 --- a/src/components/dialogs/new-project.js +++ b/src/project/new-project.js @@ -20,9 +20,9 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; class NewProjectDialog extends React.Component { valid: false; @@ -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/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 63% rename from src/containers/project.js rename to src/project/project.js index ce5e3b4..f6c9530 100644 --- a/src/containers/project.js +++ b/src/project/project.js @@ -24,24 +24,24 @@ 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 DashboardStore from '../dashboard/dashboard-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 '../dashboard/new-dashboard'; +import EditDashboardDialog from '../dashboard/edit-dashboard'; +import ImportDashboardDialog from '../dashboard/import-dashboard'; -import DeleteDialog from '../components/dialogs/delete-dialog'; +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,30 +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} /> - +
); } } -export default Container.create(Visualizations, {withProps: true}); +let fluxContainerConverter = require('../common/FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Dashboards), {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 b94c846..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,4 +156,5 @@ class Projects extends React.Component { } } -export default Container.create(Projects); +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/scenario/edit-scenario.js b/src/scenario/edit-scenario.js new file mode 100644 index 0000000..6d22d07 --- /dev/null +++ b/src/scenario/edit-scenario.js @@ -0,0 +1,101 @@ +/** + * 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 '../common/dialogs/dialog'; +import ParametersEditor from '../common/parameters-editor'; + +class EditScenarioDialog extends React.Component { + valid = true; + + constructor(props) { + super(props); + + this.state = { + name: '', + id: '', + running: false, + 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, + running: this.props.scenario.running, + startParameters: this.props.scenario.startParameters || {} + }); + }; + + handleStartParametersChange = startParameters => { + this.setState({ startParameters }); + }; + + render() { + return + + + Name + + + + + + Start Parameters + + + + + ; + } +} + +export default EditScenarioDialog; diff --git a/src/scenario/import-scenario.js b/src/scenario/import-scenario.js new file mode 100644 index 0000000..8402e23 --- /dev/null +++ b/src/scenario/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 '../common/dialogs/dialog'; +import ParametersEditor from '../common/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/scenario/new-scenario.js b/src/scenario/new-scenario.js new file mode 100644 index 0000000..c7323c5 --- /dev/null +++ b/src/scenario/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 '../common/dialogs/dialog'; +import ParametersEditor from '../common/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/scenario/scenario-store.js b/src/scenario/scenario-store.js new file mode 100644 index 0000000..cd45335 --- /dev/null +++ b/src/scenario/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 ScenariosDataManager from './scenarios-data-manager'; +import ArrayStore from '../common/array-store'; +//import UsersDataManager from "../user/users-data-manager"; +//import SimulatorDataDataManager from "../simulator/simulator-data-data-manager"; +//import AppDispatcher from "../common/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(); diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js new file mode 100644 index 0000000..681dfc5 --- /dev/null +++ b/src/scenario/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 './scenario-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 '../common/icon'; +import Table from '../common/table'; +import TableColumn from '../common/table-column'; +import ImportSimulationModelDialog from '../simulationmodel/import-simulation-model'; + +import SimulatorAction from '../simulator/simulator-action'; +import DeleteDialog from '../common/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('../common/FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Scenario), { withProps: true }); diff --git a/src/scenario/scenarios-data-manager.js b/src/scenario/scenarios-data-manager.js new file mode 100644 index 0000000..a56a61e --- /dev/null +++ b/src/scenario/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 '../common/data-managers/rest-data-manager'; +import RestAPI from "../common/api/rest-api"; +import AppDispatcher from "../common/app-dispatcher"; + +class ScenariosDataManager extends RestDataManager { + constructor() { + super('scenario', '/scenarios', ['id', 'name', 'running', 'simulationModelIDs', 'userIDs', 'dashboardIDs', 'startParameters' ]); + } + + 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/scenario/scenarios.js b/src/scenario/scenarios.js new file mode 100644 index 0000000..5789e31 --- /dev/null +++ b/src/scenario/scenarios.js @@ -0,0 +1,212 @@ +/** + * 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 '../common/app-dispatcher'; +import ScenarioStore from './scenario-store'; +import UserStore from '../user/user-store'; + +import Icon from '../common/icon'; +import Table from '../common/table'; +import TableColumn from '../common/table-column'; +import NewScenarioDialog from './new-scenario'; +import EditScenarioDialog from './edit-scenario'; +import ImportScenarioDialog from './import-scenario'; + +import DeleteDialog from '../common/dialogs/delete-dialog'; + +class Scenarios extends Component { + static getStores() { + return [ ScenarioStore, UserStore ]; + } + + static calculateState() { + const scenarios = ScenarioStore.getState(); + const sessionToken = UserStore.getState().token; + console.log(scenarios); + + return { + scenarios, + sessionToken, + + newModal: false, + deleteModal: false, + editModal: false, + importModal: false, + modalScenario: {}, + + selectedScenarios: [] + }; + } + + componentDidMount() { + AppDispatcher.dispatch({ + type: 'scenarios/start-load', + token: this.state.sessionToken + }); + } + + componentDidUpdate() {} + + 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; + + // 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'); + } + + + render() { + const buttonStyle = { + marginLeft: '10px' + }; + + return ( +
+

Scenarios

+ + + + + + 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} /> + + this.closeDeleteModal(e)} /> +
+ ); + } +} + +let fluxContainerConverter = require('../common/FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Scenarios)); diff --git a/src/components/dialogs/edit-simulation.js b/src/simulation/edit-simulation.js similarity index 91% rename from src/components/dialogs/edit-simulation.js rename to src/simulation/edit-simulation.js index 0b1c87e..7a99ab6 100644 --- a/src/components/dialogs/edit-simulation.js +++ b/src/simulation/edit-simulation.js @@ -20,10 +20,10 @@ ******************************************************************************/ 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'; +import Dialog from '../common/dialogs/dialog'; +import ParametersEditor from '../common/parameters-editor'; class EditSimulationDialog extends React.Component { valid = true; @@ -85,13 +85,13 @@ class EditSimulationDialog extends React.Component { return
- Name + Name - Start Parameters + Start Parameters diff --git a/src/components/dialogs/import-simulation.js b/src/simulation/import-simulation.js similarity index 91% rename from src/components/dialogs/import-simulation.js rename to src/simulation/import-simulation.js index e14eada..afb1438 100644 --- a/src/components/dialogs/import-simulation.js +++ b/src/simulation/import-simulation.js @@ -20,10 +20,10 @@ ******************************************************************************/ 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'; +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 }); } @@ -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/new-simulation.js b/src/simulation/new-simulation.js similarity index 90% rename from src/components/dialogs/new-simulation.js rename to src/simulation/new-simulation.js index b09559c..a6b1c8f 100644 --- a/src/components/dialogs/new-simulation.js +++ b/src/simulation/new-simulation.js @@ -20,10 +20,10 @@ ******************************************************************************/ 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'; +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; } @@ -81,13 +81,13 @@ class NewSimulationDialog extends React.Component { return - Name + Name - Start Parameters + Start Parameters 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 90% rename from src/containers/simulation.js rename to src/simulation/simulation.js index 090a8de..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() { @@ -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; } } @@ -285,4 +285,5 @@ class Simulation extends React.Component { } } -export default Container.create(Simulation, { withProps: true }); +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 2bd8a1d..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,4 +325,5 @@ class Simulations extends Component { } } -export default Container.create(Simulations); +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 88% rename from src/components/dialogs/import-simulation-model.js rename to src/simulationmodel/import-simulation-model.js index 137dfe9..991c76a 100644 --- a/src/components/dialogs/import-simulation-model.js +++ b/src/simulationmodel/import-simulation-model.js @@ -20,10 +20,10 @@ ******************************************************************************/ 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'; +import Dialog from '../common/dialogs/dialog'; class ImportSimulationModelDialog extends React.Component { imported = false; @@ -91,15 +91,15 @@ class ImportSimulationModelDialog extends React.Component { - Simulation Model File + Simulation Model File - Simulator + Simulator {this.props.simulators.map(simulator => ( - + ))} diff --git a/src/components/signal-mapping.js b/src/simulationmodel/signal-mapping.js similarity index 91% rename from src/components/signal-mapping.js rename to src/simulationmodel/signal-mapping.js index 815d90c..ca65eac 100644 --- a/src/components/signal-mapping.js +++ b/src/simulationmodel/signal-mapping.js @@ -21,11 +21,11 @@ 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'; -import TableColumn from './table-column'; +import Table from '../common/table'; +import TableColumn from '../common/table-column'; class SignalMapping extends React.Component { constructor(props) { @@ -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/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 83% rename from src/containers/simulation-model.js rename to src/simulationmodel/simulation-model.js index 975b9e6..e716191 100644 --- a/src/containers/simulation-model.js +++ b/src/simulationmodel/simulation-model.js @@ -21,17 +21,17 @@ 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'; -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() { @@ -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 => { @@ -140,15 +140,15 @@ class SimulationModel extends React.Component {
-
- Start Parameters + + Start Parameters - + - + @@ -168,4 +168,5 @@ class SimulationModel extends React.Component { } } -export default Container.create(SimulationModel, { withProps: true }); +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 77% rename from src/components/dialogs/edit-simulator.js rename to src/simulator/edit-simulator.js index 346fb2a..17358ad 100644 --- a/src/components/dialogs/edit-simulator.js +++ b/src/simulator/edit-simulator.js @@ -20,11 +20,11 @@ ******************************************************************************/ 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'; -import ParametersEditor from '../parameters-editor'; +import Dialog from '../common/dialogs/dialog'; +import ParametersEditor from '../common/parameters-editor'; class EditSimulatorDialog extends React.Component { valid = true; @@ -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; @@ -74,18 +74,18 @@ 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-simulator.js b/src/simulator/import-simulator.js similarity index 89% rename from src/components/dialogs/import-simulator.js rename to src/simulator/import-simulator.js index 8320572..4368c60 100644 --- a/src/components/dialogs/import-simulator.js +++ b/src/simulator/import-simulator.js @@ -20,10 +20,10 @@ ******************************************************************************/ 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'; +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 }); }; @@ -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/new-simulator.js b/src/simulator/new-simulator.js similarity index 93% rename from src/components/dialogs/new-simulator.js rename to src/simulator/new-simulator.js index 1eb5b34..6116d12 100644 --- a/src/components/dialogs/new-simulator.js +++ b/src/simulator/new-simulator.js @@ -20,9 +20,9 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; class NewSimulatorDialog extends React.Component { valid = false; @@ -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/containers/select-simulator.js b/src/simulator/select-simulator.js similarity index 83% rename from src/containers/select-simulator.js rename to src/simulator/select-simulator.js index bcf7719..2061adf 100644 --- a/src/containers/select-simulator.js +++ b/src/simulator/select-simulator.js @@ -21,10 +21,10 @@ 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'; +import SimulatorStore from './simulator-store'; class SelectSimulator extends React.Component { static getStores() { @@ -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,19 +60,19 @@ 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); } } render() { - const simulatorOptions = this.state.simulators.map(s => + const simulatorOptions = this.state.simulators.map(s => ); return -
+ Simulator @@ -85,4 +85,5 @@ class SelectSimulator extends React.Component { } } -export default Container.create(SelectSimulator); +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 90% rename from src/components/simulator-action.js rename to src/simulator/simulator-action.js index aef6625..765856f 100644 --- a/src/components/simulator-action.js +++ b/src/simulator/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/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 86% rename from src/stores/simulator-store.js rename to src/simulator/simulator-store.js index 00b8635..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() { @@ -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/data-managers/simulators-data-manager.js b/src/simulator/simulators-data-manager.js similarity index 84% rename from src/data-managers/simulators-data-manager.js rename to src/simulator/simulators-data-manager.js index df45f34..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() { @@ -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/containers/simulators.js b/src/simulator/simulators.js similarity index 76% rename from src/containers/simulators.js rename to src/simulator/simulators.js index 9e07bab..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() { @@ -66,16 +66,20 @@ 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 { sessionToken: UserStore.getState().token, + sessionUserID: UserStore.getState().userid, simulators, modalSimulator: {}, deleteModal: false, @@ -87,7 +91,8 @@ 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 @@ -99,10 +104,17 @@ class Simulators extends Component { } refresh() { - AppDispatcher.dispatch({ - type: 'simulators/start-load', - token: this.state.sessionToken - }); + + 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 + }); + } } @@ -113,7 +125,8 @@ class Simulators extends Component { AppDispatcher.dispatch({ type: 'simulators/start-add', data, - token: this.state.sessionToken + token: this.state.sessionToken, + userid: this.state.sessionUserID }); } } @@ -123,18 +136,22 @@ 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 }); 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) { @@ -144,14 +161,15 @@ 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 }); } 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' }); @@ -165,7 +183,8 @@ class Simulators extends Component { AppDispatcher.dispatch({ type: 'simulators/start-add', data, - token: this.state.sessionToken + token: this.state.sessionToken, + userid: this.state.sessionUserID }); } } @@ -201,12 +220,13 @@ 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 }); } } - isSimulatorOutdated(simulator) { + static isSimulatorOutdated(simulator) { if (!simulator.stateUpdatedAt) return true; @@ -215,10 +235,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 +270,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 +288,15 @@ class Simulators extends Component {
this.onSimulatorChecked(index, event)} width='30' /> - + {/* */} - + this.closeEditModal(data)} simulator={this.state.modalSimulator} /> this.closeImportModal(data)} /> - + this.closeDeleteModal(e)} /> ); } } -export default Container.create(Simulators); +let fluxContainerConverter = require('../common/FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Simulators)); 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/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 { diff --git a/src/user/edit-own-user.js b/src/user/edit-own-user.js new file mode 100644 index 0000000..bb37f50 --- /dev/null +++ b/src/user/edit-own-user.js @@ -0,0 +1,152 @@ +/** + * 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: '', + mail: '', + role: '', + id: '', + password: '', + oldPassword: '', + active: '', + confirmpassword: '' + } + } + + + + onClose(canceled) { + if (canceled === false) { + if (this.valid) { + this.props.onClose(this.state); + } + } else { + this.props.onClose(); + } + } + + + + handleChange(e) { + let user = UserStore.getState().currentUser; + 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 oldPassword = true; + var confirmpassword = 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.oldPassword === ''){ + oldPassword = false; + } + + if(this.state.confirmpassword === ''){ + confirmpassword = false; + } + + + this.setState({ + role: user.role, + id: user.id + }); + + // form is valid if any of the fields contain somethig + this.valid = username || role || active || oldPassword || mail || pw || confirmpassword; + + } + + 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)} /> + + + + Confirm New Password + this.handleChange(e)} /> + + + + ); + } +} + +export default EditOwnUserDialog; diff --git a/src/user/edit-user.js b/src/user/edit-user.js new file mode 100644 index 0000000..3427452 --- /dev/null +++ b/src/user/edit-user.js @@ -0,0 +1,158 @@ +/** + * 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'; + +class EditUserDialog extends React.Component { + valid: true; + + constructor(props) { + super(props); + + this.state = { + username: '', + mail: '', + role: '', + id: '', + password: '', + active: '', + confirmpassword: '', + oldPassword: '' + } + } + + onClose(canceled) { + if (canceled === false) { + if (this.valid) { + this.props.onClose(this.state); + } + } else { + this.props.onClose(); + } + } + + handleChange(e) { + 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 confirmpassword = true; + var oldPW = true; + + + if (this.state.username === '') { + username = false; + } + + if (this.state.role === ''){ + role = false; + } + + if(this.state.mail === ''){ + mail = false; + } + + if(this.state.password === ''){ + pw = false; + } + + if(this.state.active === ''){ + active = false; + } + + if(this.state.confirmpassword === ''){ + 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 || oldPW; + + } + + 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)} /> + + + Password + this.handleChange(e)} /> + + + Confirm New Password + this.handleChange(e)} /> + + + Role + this.handleChange(e)}> + + + + + + + + Active + this.handleChange(e)}> + + + + + + +
+ ); + } +} + +export default EditUserDialog; diff --git a/src/components/login-form.js b/src/user/login-form.js similarity index 85% rename from src/components/login-form.js rename to src/user/login-form.js index 7e09091..a038f38 100644 --- a/src/components/login-form.js +++ b/src/user/login-form.js @@ -20,9 +20,9 @@ ******************************************************************************/ 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'; +import AppDispatcher from '../common/app-dispatcher'; class LoginForm extends Component { constructor(props) { @@ -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/containers/login.js b/src/user/login.js similarity index 74% rename from src/containers/login.js rename to src/user/login.js index 2a812cf..3f1e3b6 100644 --- a/src/containers/login.js +++ b/src/user/login.js @@ -21,17 +21,17 @@ 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'; -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() { @@ -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); } } } @@ -82,7 +86,7 @@ class Login extends Component {
- Login + Login
@@ -93,4 +97,5 @@ class Login extends Component { } } -export default Container.create(Login); +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 64% rename from src/components/dialogs/new-user.js rename to src/user/new-user.js index f3cf20d..5919568 100644 --- a/src/components/dialogs/new-user.js +++ b/src/user/new-user.js @@ -20,9 +20,9 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel, HelpBlock } from 'react-bootstrap'; +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; @@ -33,8 +33,8 @@ class NewUserDialog extends React.Component { this.state = { username: '', mail: '', - role: 'admin', - password: '' + role: 'User', + password: '', }; } @@ -50,61 +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', - password: '' + role: 'User', + password: '', }); } - validateForm(target) { - // check all controls - let username = this.state.username !== '' && this.state.username.length >= 3; - let password = this.state.password !== ''; - - this.valid = username && password; - - // return state to control - switch(target) { - case 'username': - return username ? "success" : "error"; - case 'password': - return password ? "success" : "error"; - default: - return "success"; - } - } - render() { return ( 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 - this.handleChange(e)}> - - - + + Role + this.handleChange(e)}> + + + diff --git a/src/stores/user-store.js b/src/user/user-store.js similarity index 82% rename from src/stores/user-store.js rename to src/user/user-store.js index e8722c8..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() { @@ -35,6 +35,7 @@ class UserStore extends ReduceStore { users: [], currentUser: null, token: null, + userid: 0, loginMessage: null }; } @@ -53,14 +54,14 @@ 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, action.userid); - return Object.assign({}, state, { token: action.token }); + return Object.assign({}, state, { token: action.token, userid: action.userid}); case 'users/current-user': - // save logged-in user - return Object.assign({}, state, { currentUser: action.user }); + // // save logged-in user + return Object.assign({}, state, { currentUser: action.user}); case 'users/current-user-error': // discard user token @@ -72,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/user/user.js b/src/user/user.js new file mode 100644 index 0000000..74ac1a8 --- /dev/null +++ b/src/user/user.js @@ -0,0 +1,144 @@ +/** + * 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} 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 EditOwnUserDialog from './edit-own-user' + + +class User extends Component { + static getStores() { + return [ UserStore, UsersStore ]; + } + + static calculateState(prevState, props) { + //prevState = prevState || {}; + + let 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, + newModal: false, + editModal: false, + update: false, + modalData: {} + }; + } + + + + closeEditModal(data) { + this.setState({ editModal: false }); + console.log(data); + + if (data) { + if(data.password === data.confirmpassword){ + + AppDispatcher.dispatch({ + type: 'users/start-own-edit', + data: data, + token: this.state.token + }); + } + + else{ + AppDispatcher.dispatch({ + type: 'users/confirm-pw-doesnt-match', + 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] : ''; + } + + + 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} /> + + + + + ); + } +} + + + + +let fluxContainerConverter = require('../common/FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(User)); diff --git a/src/data-managers/users-data-manager.js b/src/user/users-data-manager.js similarity index 81% rename from src/data-managers/users-data-manager.js rename to src/user/users-data-manager.js index f5db8f8..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() { @@ -32,7 +32,9 @@ 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, + userid: response.user.id }); }).catch(error => { AppDispatcher.dispatch({ @@ -42,8 +44,8 @@ class UsersDataManager extends RestDataManager { }); } - getCurrentUser(token) { - RestAPI.get(this.makeURL('/users/me'), token).then(response => { + getCurrentUser(token, id) { + RestAPI.get(this.makeURL('/users/' + id), token).then(response => { AppDispatcher.dispatch({ type: 'users/current-user', user: response.user @@ -55,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 88% rename from src/stores/users-store.js rename to src/user/users-store.js index e42b1ed..b2ddfe9 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() { @@ -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,11 +51,11 @@ class UsersStore extends ArrayStore { title: 'Failed to edit user', message: action.error.response.body.message, level: 'error' - } + }; 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/containers/users.js b/src/user/users.js similarity index 71% rename from src/containers/users.js rename to src/user/users.js index 1e1779e..1b788a0 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() { @@ -75,7 +75,7 @@ class Users extends Component { } } - closeDeleteModal = confirmDelete => { + closeDeleteModal(confirmDelete) { this.setState({ deleteModal: false }); if (confirmDelete === false) { @@ -93,16 +93,27 @@ 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{ + AppDispatcher.dispatch({ + type: 'users/confirm-pw-doesnt-match', + data: data, + token: this.state.token + }); + } + } } getHumanRoleName(role_key) { - const HUMAN_ROLE_NAMES = {admin: 'Administrator', user: 'User', guest: 'Guest'}; + const HUMAN_ROLE_NAMES = {Admin: 'Administrator', User: 'User', Guest: 'Guest'}; return HUMAN_ROLE_NAMES.hasOwnProperty(role_key)? HUMAN_ROLE_NAMES[role_key] : ''; } @@ -113,7 +124,7 @@ class Users extends Component { this.confirmDeleteModal(); } - } + }; render() { @@ -123,9 +134,11 @@ 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] })} />
@@ -133,10 +146,11 @@ class Users extends Component { this.closeNewModal(data)} /> this.closeEditModal(data)} user={this.state.modalData} /> - + this.closeDeleteModal(e)} />
); } } -export default Container.create(Users); +let fluxContainerConverter = require('../common/FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Users)); diff --git a/src/components/dialogs/edit-widget-aspect-control.js b/src/widget/edit-widget-aspect-control.js similarity index 84% rename from src/components/dialogs/edit-widget-aspect-control.js rename to src/widget/edit-widget-aspect-control.js index 2e4d4d8..502e837 100644 --- a/src/components/dialogs/edit-widget-aspect-control.js +++ b/src/widget/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/widget/edit-widget-checkbox-control.js similarity index 81% rename from src/components/dialogs/edit-widget-checkbox-control.js rename to src/widget/edit-widget-checkbox-control.js index 9c063fb..0118abb 100644 --- a/src/components/dialogs/edit-widget-checkbox-control.js +++ b/src/widget/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/widget/edit-widget-color-control.js similarity index 78% rename from src/components/dialogs/edit-widget-color-control.js rename to src/widget/edit-widget-color-control.js index 6a44e3d..b54b666 100644 --- a/src/components/dialogs/edit-widget-color-control.js +++ b/src/widget/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/widget/edit-widget-color-zones-control.js similarity index 93% rename from src/components/dialogs/edit-widget-color-zones-control.js rename to src/widget/edit-widget-color-zones-control.js index 3367218..c124353 100644 --- a/src/components/dialogs/edit-widget-color-zones-control.js +++ b/src/widget/edit-widget-color-zones-control.js @@ -20,12 +20,12 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, ControlLabel, Button } from 'react-bootstrap'; +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) { @@ -115,7 +115,7 @@ class EditWidgetColorZonesControl extends React.Component { render() { return - Color zones + Color zones 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 93% rename from src/components/dialogs/edit-widget-html-content.js rename to src/widget/edit-widget-html-content.js index 3b02bc3..8633a61 100644 --- a/src/components/dialogs/edit-widget-html-content.js +++ b/src/widget/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/widget/edit-widget-image-control.js similarity index 92% rename from src/components/dialogs/edit-widget-image-control.js rename to src/widget/edit-widget-image-control.js index 9db27ac..e9d0118 100644 --- a/src/components/dialogs/edit-widget-image-control.js +++ b/src/widget/edit-widget-image-control.js @@ -20,9 +20,9 @@ ******************************************************************************/ 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'; +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', @@ -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/widget/edit-widget-min-max-control.js similarity index 86% rename from src/components/dialogs/edit-widget-min-max-control.js rename to src/widget/edit-widget-min-max-control.js index 39218bf..a09ae77 100644 --- a/src/components/dialogs/edit-widget-min-max-control.js +++ b/src/widget/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/widget/edit-widget-number-control.js similarity index 92% rename from src/components/dialogs/edit-widget-number-control.js rename to src/widget/edit-widget-number-control.js index 07de491..378d724 100644 --- a/src/components/dialogs/edit-widget-number-control.js +++ b/src/widget/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/widget/edit-widget-orientation.js similarity index 83% rename from src/components/dialogs/edit-widget-orientation.js rename to src/widget/edit-widget-orientation.js index 737aaef..88ee57c 100644 --- a/src/components/dialogs/edit-widget-orientation.js +++ b/src/widget/edit-widget-orientation.js @@ -20,9 +20,9 @@ **********************************************************************************/ 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'; +import WidgetSlider from './widgets/slider'; class EditWidgetOrientation extends Component { constructor(props) { @@ -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/widget/edit-widget-parameters-control.js similarity index 91% rename from src/components/dialogs/edit-widget-parameters-control.js rename to src/widget/edit-widget-parameters-control.js index 8cf454b..1831a5c 100644 --- a/src/components/dialogs/edit-widget-parameters-control.js +++ b/src/widget/edit-widget-parameters-control.js @@ -20,8 +20,8 @@ **********************************************************************************/ import React, { Component } from 'react'; -import { FormGroup, ControlLabel } from 'react-bootstrap'; -import ParametersEditor from '../parameters-editor'; +import { FormGroup, FormLabel } from 'react-bootstrap'; +import ParametersEditor from '../common/parameters-editor'; class EditWidgetParametersControl extends Component { constructor(props) { @@ -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/widget/edit-widget-signal-control.js similarity index 95% rename from src/components/dialogs/edit-widget-signal-control.js rename to src/widget/edit-widget-signal-control.js index 4664936..05f3710 100644 --- a/src/components/dialogs/edit-widget-signal-control.js +++ b/src/widget/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/widget/edit-widget-signals-control.js similarity index 87% rename from src/components/dialogs/edit-widget-signals-control.js rename to src/widget/edit-widget-signals-control.js index 0b55312..045a269 100644 --- a/src/components/dialogs/edit-widget-signals-control.js +++ b/src/widget/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/widget/edit-widget-simulation-control.js similarity index 93% rename from src/components/dialogs/edit-widget-simulation-control.js rename to src/widget/edit-widget-simulation-control.js index 3ad0642..c9ca495 100644 --- a/src/components/dialogs/edit-widget-simulation-control.js +++ b/src/widget/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/widget/edit-widget-text-control.js similarity index 92% rename from src/components/dialogs/edit-widget-text-control.js rename to src/widget/edit-widget-text-control.js index d46b98a..bbac6d2 100644 --- a/src/components/dialogs/edit-widget-text-control.js +++ b/src/widget/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/widget/edit-widget-text-size-control.js similarity index 89% rename from src/components/dialogs/edit-widget-text-size-control.js rename to src/widget/edit-widget-text-size-control.js index 0c66ebb..655cdf5 100644 --- a/src/components/dialogs/edit-widget-text-size-control.js +++ b/src/widget/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/widget/edit-widget-time-control.js similarity index 89% rename from src/components/dialogs/edit-widget-time-control.js rename to src/widget/edit-widget-time-control.js index 8f6434d..cd3d372 100644 --- a/src/components/dialogs/edit-widget-time-control.js +++ b/src/widget/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/widget/edit-widget.js similarity index 97% rename from src/components/dialogs/edit-widget.js rename to src/widget/edit-widget.js index 95e20c7..051feae 100644 --- a/src/components/dialogs/edit-widget.js +++ b/src/widget/edit-widget.js @@ -20,9 +20,9 @@ ******************************************************************************/ import React from 'react'; -//import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +//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/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/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 94% rename from src/components/widget-plot/plot-legend.js rename to src/widget/widget-plot/plot-legend.js index 4bde597..239072c 100644 --- a/src/components/widget-plot/plot-legend.js +++ b/src/widget/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/widget/widget-plot/plot.js similarity index 98% rename from src/components/widget-plot/plot.js rename to src/widget/widget-plot/plot.js index a3f6d37..044598d 100644 --- a/src/components/widget-plot/plot.js +++ b/src/widget/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/widget/widget.js b/src/widget/widget.js new file mode 100644 index 0000000..4513cf7 --- /dev/null +++ b/src/widget/widget.js @@ -0,0 +1,181 @@ +/** + * File: widget.js + * Author: Markus Grigull + * Date: 04.03.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 { Container } from 'flux/utils'; + +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 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'; +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'; + +class Widget extends React.Component { + static getStores() { + return [ SimulatorDataStore, SimulationModelStore, FileStore, UserStore ]; + } + + static calculateState(prevState, props) { + let simulatorData = {}; + + if (props.paused) { + if (prevState && prevState.simulatorData) { + simulatorData = JSON.parse(JSON.stringify(prevState.simulatorData)); + } + } else { + simulatorData = SimulatorDataStore.getState(); + } + + return { + simulatorData, + files: FileStore.getState(), + simulationModels: SimulationModelStore.getState(), + + sequence: prevState != null ? prevState.sequence + 1 : 0, + + sessionToken: UserStore.getState().token + }; + } + + componentWillMount() { + if (this.state.sessionToken == null) { + return; + } + + AppDispatcher.dispatch({ + type: 'files/start-load', + token: this.state.sessionToken + }); + + AppDispatcher.dispatch({ + type: 'simulationModels/start-load', + token: this.state.sessionToken + }); + + } + + inputDataChanged(widget, data) { + let simulationModel = null; + + for (let model of this.state.simulationModels) { + if (model._id !== widget.simulationModel) { + continue; + } + + simulationModel = model; + } + + AppDispatcher.dispatch({ + type: 'simulatorData/inputChanged', + simulator: simulationModel.simulator, + signal: widget.signal, + data + }); + } + + createWidget(widget) { + let simulationModel = null; + + for (let model of this.state.simulationModels) { + if (model._id !== widget.simulationModel) { + continue; + } + + simulationModel = model; + } + + if (widget.type === 'CustomAction') { + return + } else if (widget.type === 'Action') { + return + } else if (widget.type === 'Lamp') { + return + } else if (widget.type === 'Value') { + return + } else if (widget.type === 'Plot') { + return + } else if (widget.type === 'Table') { + return + } else if (widget.type === 'Label') { + return + } else if (widget.type === 'PlotTable') { + return this.props.onWidgetStatusChange(w, this.props.index)} paused={this.props.paused} /> + } else if (widget.type === 'Image') { + return + } else if (widget.type === 'Button') { + return this.inputDataChanged(widget, value)} /> + } else if (widget.type === 'NumberInput') { + return this.inputDataChanged(widget, value)} /> + } else if (widget.type === 'Slider') { + return this.props.onWidgetStatusChange(w, this.props.index) } onInputChanged={value => this.inputDataChanged(widget, value)} /> + } else if (widget.type === 'Gauge') { + return + } else if (widget.type === 'Box') { + return + } else if (widget.type === 'HTML') { + return + } else if (widget.type === 'Topology') { + return + } + + return null; + } + + + render() { + const element = this.createWidget(this.props.data); + + if (this.props.editing) { + return + {element} + ; + } + + return + {element} + ; + } +} + +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 94% rename from src/components/widgets/input.js rename to src/widget/widgets/input.js index 63bc655..7272279 100644 --- a/src/components/widgets/input.js +++ b/src/widget/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/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 95% rename from src/components/widgets/plot-table.js rename to src/widget/widgets/plot-table.js index 368f7c5..1b6fc80 100644 --- a/src/components/widgets/plot-table.js +++ b/src/widget/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/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 93% rename from src/components/widgets/topology.js rename to src/widget/widgets/topology.js index c47b155..bd7c62a 100644 --- a/src/components/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': 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