diff --git a/package-lock.json b/package-lock.json index 5256699d0..d3e2277db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "arachne-ui", - "version": "1.15.24", + "version": "1.16.32", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -174,7 +174,7 @@ "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" @@ -193,12 +193,12 @@ "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=" + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "arachne-ui-components": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/arachne-ui-components/-/arachne-ui-components-1.15.6.tgz", - "integrity": "sha512-ptRCE+E4xbs5jp3oYE9wq0wEjIHBiRl8wmDwwv5lRfNzwhIMtfNx45Opi+Y1bPbqesMZxLpk3A/nhrkS3rkiug==", + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/arachne-ui-components/-/arachne-ui-components-1.16.3.tgz", + "integrity": "sha512-pe7pce7q/OjteIuICu9daM3AGeTV/1G81dCdGVP74rqYUWE5eZWioTxCUd+Rju4DJWcsNLsZHz+QhGWjR308PA==", "requires": { "classnames": "2.2.5", "flexboxgrid": "6.3.1", @@ -292,7 +292,7 @@ "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "requires": { "sprintf-js": "~1.0.2" } @@ -305,7 +305,7 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=" + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" }, "arr-union": { "version": "3.1.0", @@ -395,7 +395,7 @@ "asn1.js": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA=", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -435,7 +435,7 @@ "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha1-5gtrDo8wG9l+U3UhW9pAbIURjAs=", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, "assign-symbols": { @@ -507,7 +507,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -588,7 +588,7 @@ "babel-generator": { "version": "6.26.1", "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha1-GERAjTuPDTWkBOp6wYDwh6YBvZA=", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "requires": { "babel-messages": "^6.23.0", "babel-runtime": "^6.26.0", @@ -1197,7 +1197,7 @@ "babel-plugin-transform-require-ignore": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-require-ignore/-/babel-plugin-transform-require-ignore-0.1.1.tgz", - "integrity": "sha1-GrsPgDzClkbdAFf1OP20qY1suLI=", + "integrity": "sha512-A7EmlVd3ZYWJI3eg3dklAXn1yfq8Y5omHMQgAUo0FwGLYRuL5daLR6+LtCVHi4f9+fStr7HuPkW9rmKtcmY67w==", "dev": true }, "babel-plugin-transform-runtime": { @@ -1414,7 +1414,7 @@ "babylon": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=" + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" }, "balanced-match": { "version": "1.0.0", @@ -1424,7 +1424,7 @@ "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "requires": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -1533,7 +1533,7 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=" + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" }, "body-parser": { "version": "1.19.0", @@ -1603,7 +1603,7 @@ "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1707,7 +1707,7 @@ "browserify-zlib": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "requires": { "pako": "~1.0.5" } @@ -1739,7 +1739,7 @@ "buffer-indexof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow=", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", "dev": true }, "buffer-xor": { @@ -1760,7 +1760,7 @@ "cacache": { "version": "10.0.4", "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", - "integrity": "sha1-ZFI2eZnv+dQYiu/ZoU6dfGomNGA=", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", "requires": { "bluebird": "^3.5.1", "chownr": "^1.0.1", @@ -1793,14 +1793,14 @@ "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=" + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" } } }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "requires": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -2024,7 +2024,7 @@ "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -2033,7 +2033,7 @@ "circular-json": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", "dev": true }, "clamp-js": { @@ -2044,7 +2044,7 @@ "clap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha1-TzZ0WzIAhJJVf0ZBLWbVDLmbzlE=", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", "requires": { "chalk": "^1.1.3" } @@ -2052,7 +2052,7 @@ "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "requires": { "arr-union": "^3.1.0", "define-property": "^0.2.5", @@ -2365,12 +2365,12 @@ "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "content-type-parser": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz", - "integrity": "sha1-yqvoBiPmNjiyUC/Ux/Ev9M4jUuc=", + "integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==", "dev": true }, "convert-source-map": { @@ -2394,7 +2394,7 @@ "copy-concurrently": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "requires": { "aproba": "^1.1.1", "fs-write-stream-atomic": "^1.0.8", @@ -2524,7 +2524,7 @@ "create-react-class": { "version": "15.6.3", "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz", - "integrity": "sha1-LXMjf7P5cK5uvgEanmb0bbyoADY=", + "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==", "requires": { "fbjs": "^0.8.9", "loose-envify": "^1.3.1", @@ -2553,7 +2553,7 @@ "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "requires": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -2804,7 +2804,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -2872,7 +2872,7 @@ "d3": { "version": "4.13.0", "resolved": "https://registry.npmjs.org/d3/-/d3-4.13.0.tgz", - "integrity": "sha1-qyNv+M8M/CeoHmm/L7dRi8m08z0=", + "integrity": "sha512-l8c4+0SldjVKLaE2WG++EQlqD7mh/dmQjvi2L2lKPadAVC+TbJC4ci7Uk9bRi+To0+ansgsS0iWfPjD7DBy+FQ==", "requires": { "d3-array": "1.2.1", "d3-axis": "1.0.8", @@ -2916,7 +2916,7 @@ "d3-array": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.1.tgz", - "integrity": "sha1-0coz3i9qwx76244FCgIdfiOW1dw=" + "integrity": "sha512-CyINJQ0SOUHojDdFDH4JEM0552vCR1utGyLHegJHyYH0JyCpSeTPxi4OBqHMA2jJZq4NH782LtaJWBImqI/HBw==" }, "d3-axis": { "version": "1.0.8", @@ -2962,7 +2962,7 @@ "d3-drag": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.1.tgz", - "integrity": "sha1-343UxQL7SQ/HRiBGqK2YpcR5KC0=", + "integrity": "sha512-Cg8/K2rTtzxzrb0fmnYOUeZHvwa4PHzwXOLZZPwtEs2SKLLKLXeYwZKBB+DlOxUvFmarOnmt//cU4+3US2lyyQ==", "requires": { "d3-dispatch": "1", "d3-selection": "1" @@ -2971,7 +2971,7 @@ "d3-dsv": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.0.8.tgz", - "integrity": "sha1-kH4kDVezhmGNxWRous/na/GXZK4=", + "integrity": "sha512-IVCJpQ+YGe3qu6odkPQI0KPqfxkhbP/oM1XhhE/DFiYmcXKfCRub4KXyiuehV1d4drjWVXHUWx4gHqhdZb6n/A==", "requires": { "commander": "2", "iconv-lite": "0.4", @@ -2986,7 +2986,7 @@ "d3-force": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.1.0.tgz", - "integrity": "sha1-zr88aU8QePzD1Nr45Wey+9cNTqM=", + "integrity": "sha512-2HVQz3/VCQs0QeRNZTYb7GxoUCeb6bOzMp/cGcLa87awY9ZsPvXOGeZm0iaGBjXic6I1ysKwMn+g+5jSAdzwcg==", "requires": { "d3-collection": "1", "d3-dispatch": "1", @@ -2997,12 +2997,12 @@ "d3-format": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.2.2.tgz", - "integrity": "sha1-GjnEecilf+UFGy5no77icGGnTno=" + "integrity": "sha512-zH9CfF/3C8zUI47nsiKfD0+AGDEuM8LwBIP7pBVpyR4l/sKkZqITmMtxRp04rwBrlshIZ17XeFAaovN3++wzkw==" }, "d3-geo": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.9.1.tgz", - "integrity": "sha1-FX47D5FzedD3O+v/875Tf0n6c1Y=", + "integrity": "sha512-l9wL/cEQkyZQYXw3xbmLsH3eQ5ij+icNfo4r0GrLa5rOCZR/e/3am45IQ0FvQ5uMsv+77zBRunLc9ufTWSQYFA==", "requires": { "d3-array": "1" } @@ -3015,7 +3015,7 @@ "d3-interpolate": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.6.tgz", - "integrity": "sha1-LPOVriOBgE3wiqG/dmt/l7X2j7Y=", + "integrity": "sha512-mOnv5a+pZzkNIHtw/V6I+w9Lqm9L5bG3OTXPM5A+QO0yyVMQ4W1uZhR+VOJmazaOZXri2ppbiZ5BUNWT0pFM9A==", "requires": { "d3-color": "1" } @@ -3048,7 +3048,7 @@ "d3-request": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/d3-request/-/d3-request-1.0.6.tgz", - "integrity": "sha1-oQRKnvTsKMgkFxyTefrm15R0sZ8=", + "integrity": "sha512-FJj8ySY6GYuAJHZMaCQ83xEYE4KbkPkmxZ3Hu6zA1xxG2GD+z6P+Lyp+zjdsHf0xEbp2xcluDI50rCS855EQ6w==", "requires": { "d3-collection": "1", "d3-dispatch": "1", @@ -3059,7 +3059,7 @@ "d3-scale": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz", - "integrity": "sha1-+pAySz6op3ZCK9BHKvqwslKglF0=", + "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==", "requires": { "d3-array": "^1.2.0", "d3-collection": "1", @@ -3086,12 +3086,12 @@ "d3-time": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.8.tgz", - "integrity": "sha1-29LWAHv0Fv5np20XlHt4S//qHoQ=" + "integrity": "sha512-YRZkNhphZh3KcnBfitvF3c6E0JOFGikHZ4YqD+Lzv83ZHn1/u6yGenRU1m+KAk9J1GnZMnKcrtfvSktlA1DXNQ==" }, "d3-time-format": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.1.tgz", - "integrity": "sha1-hbfN+8n/yhh/FNPEVv/aJoCBuzE=", + "integrity": "sha512-8kAkymq2WMfzW7e+s/IUNAtN/y3gZXGRrdGfo6R8NKPAA85UBTxZg5E61bR6nLwjPjj4d3zywSQe1CkYLPFyrw==", "requires": { "d3-time": "1" } @@ -3099,7 +3099,7 @@ "d3-timer": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.7.tgz", - "integrity": "sha1-35ZQylh/bJZgf/TmDMOCKejdhTE=" + "integrity": "sha512-vMZXR88XujmG/L5oB96NNKH5lCWwiLM/S2HyyAQLcjWJCloK5shxta4CwOFYLZoY3AWX73v8Lgv4cCAdWtRmOA==" }, "d3-tip": { "version": "0.7.1", @@ -3112,7 +3112,7 @@ "d3-transition": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.1.1.tgz", - "integrity": "sha1-2O+Jw7hIc1sGDlSjmzKq66pCEDk=", + "integrity": "sha512-xeg8oggyQ+y5eb4J13iDgKIjUcEfIOZs2BqV/eEmXm2twx80wTzJ4tB4vaZ5BKfz7XsI/DFmQL5me6O27/5ykQ==", "requires": { "d3-color": "1", "d3-dispatch": "1", @@ -3130,7 +3130,7 @@ "d3-zoom": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.7.1.tgz", - "integrity": "sha1-AvQ7PD4ttU82RYLX5KI2zMVQa2M=", + "integrity": "sha512-sZHQ55DGq5BZBFGnRshUT8tm2sfhPHFnOlmPbbwTkAoPeVdRTkB4Xsf9GCY0TSHrTD8PeJPZGmP/TpGicwJDJQ==", "requires": { "d3-dispatch": "1", "d3-drag": "1", @@ -3162,7 +3162,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } @@ -3222,7 +3222,7 @@ "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -3420,7 +3420,7 @@ "dns-packet": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha1-EqpCaYEHW+UAuRDu3NC0fdfe2lo=", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", "dev": true, "requires": { "ip": "^1.1.0", @@ -3439,7 +3439,7 @@ "doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha1-XNAfwQFiG0LEzX9dGmYkNxbT850=", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { "esutils": "^2.0.2" @@ -3482,7 +3482,7 @@ "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=" + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" }, "domelementtype": { "version": "1.3.1", @@ -3651,7 +3651,7 @@ "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "requires": { "prr": "~1.0.1" } @@ -3715,7 +3715,7 @@ "es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha1-njr0B0Wd7tR+mpH5uIWoTrBcVh0=" + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==" }, "es6-iterator": { "version": "2.0.3", @@ -3920,7 +3920,7 @@ "eslint-import-resolver-node": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", - "integrity": "sha1-WPFfuDm40FdsqYBBNHaqskcttmo=", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", "dev": true, "requires": { "debug": "^2.6.9", @@ -3930,7 +3930,7 @@ "eslint-import-resolver-webpack": { "version": "0.8.4", "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.8.4.tgz", - "integrity": "sha1-D3zXS8nX/Bdz6NX8Jbr4ZLL4ekI=", + "integrity": "sha512-b6JxR57ruiMxq2tIu4T/SrYED5RKJfeBEs8u3+JWF+O2RxDmFpUH84c5uS1T5qiP0K4r0SL7CXhvd41hXdDlAg==", "dev": true, "requires": { "array-find": "^1.0.0", @@ -3974,7 +3974,7 @@ "eslint-loader": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.9.0.tgz", - "integrity": "sha1-fhvp/t3KMo09z67xrUnVvv/oOhM=", + "integrity": "sha512-40aN976qSNPyb9ejTqjEthZITpls1SVKtwguahmH1dzGCwQU/vySE+xX33VZmD8csU0ahVNCtFlsPgKqRBiqgg==", "dev": true, "requires": { "loader-fs-cache": "^1.0.0", @@ -4064,7 +4064,7 @@ "espree": { "version": "3.5.4", "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha1-sPRHGHyKi+2US4FaZgvd9d610ac=", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", "dev": true, "requires": { "acorn": "^5.5.0", @@ -4088,7 +4088,7 @@ "esrecurse": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "requires": { "estraverse": "^4.1.0" } @@ -4139,7 +4139,7 @@ "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "requires": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -4311,7 +4311,7 @@ "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { "is-plain-object": "^2.0.4" } @@ -4321,7 +4321,7 @@ "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "requires": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -4508,7 +4508,7 @@ "file-loader": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", - "integrity": "sha1-b+iGRJsPKpNuQ8q6rAzb+zaVBvg=", + "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", "requires": { "loader-utils": "^1.0.2", "schema-utils": "^0.4.5" @@ -5270,7 +5270,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "function.prototype.name": { "version": "1.1.1", @@ -5503,7 +5503,7 @@ "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=" + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" }, "globby": { "version": "3.0.1", @@ -5564,7 +5564,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } @@ -5802,7 +5802,7 @@ "html-encoding-sniffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha1-5w2EuU2lOqN14R/jo1G+ZkLKRvg=", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "dev": true, "requires": { "whatwg-encoding": "^1.0.1" @@ -6039,7 +6039,7 @@ }, "immediate": { "version": "3.0.6", - "resolved": "http://mdlpsrv02.firstlinesoftware.ru:4873/immediate/-/immediate-3.0.6.tgz", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" }, "import-cwd": { @@ -6070,7 +6070,7 @@ "import-local": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha1-Xk/9wD9P5sAJxnKb6yljHC+CJ7w=", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", "dev": true, "requires": { "pkg-dir": "^2.0.0", @@ -6279,7 +6279,7 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-callable": { "version": "1.1.4", @@ -6375,7 +6375,7 @@ "is-my-ip-valid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", - "integrity": "sha1-ezUbjo7dTTmV1NBmaA5mTZRpaCQ=", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", "dev": true }, "is-my-json-valid": { @@ -6431,7 +6431,7 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "requires": { "isobject": "^3.0.1" } @@ -6486,7 +6486,7 @@ "is-resolvable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg=", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, "is-stream": { @@ -6540,7 +6540,7 @@ "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=" + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" }, "is-wsl": { "version": "1.1.0", @@ -6651,7 +6651,7 @@ "json-loader": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha1-3KFKcCNf+C8KyaOr62DTN6NlGF0=" + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" }, "json-parse-better-errors": { "version": "1.0.2", @@ -6787,7 +6787,7 @@ }, "lie": { "version": "3.3.0", - "resolved": "http://mdlpsrv02.firstlinesoftware.ru:4873/lie/-/lie-3.3.0.tgz", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "requires": { "immediate": "~3.0.5" @@ -7434,7 +7434,7 @@ "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -7461,7 +7461,7 @@ "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=" + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, "min-document": { "version": "2.19.0", @@ -7484,7 +7484,7 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "^1.1.7" } @@ -7497,7 +7497,7 @@ "mississippi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", - "integrity": "sha1-NEKlCPr8KFAEhv7qmUCWduTuWm8=", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", "requires": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", @@ -7541,7 +7541,7 @@ "mocha": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", - "integrity": "sha1-HgSA/jbS2lhY0etqzDhBiybqog0=", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", "dev": true, "requires": { "browser-stdout": "1.3.0", @@ -7653,7 +7653,7 @@ "multicast-dns": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha1-oOx72QVcQoL3kMPIL04o2zsxsik=", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", "dev": true, "requires": { "dns-packet": "^1.3.1", @@ -7726,7 +7726,7 @@ "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "requires": { "lower-case": "^1.1.1" } @@ -7747,7 +7747,7 @@ "node-fetch": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha1-mA9vcthSEaU0fGsrwYxbhMPrR+8=", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", "requires": { "encoding": "^0.1.11", "is-stream": "^1.0.1" @@ -7795,7 +7795,7 @@ }, "semver": { "version": "5.3.0", - "resolved": "http://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", "dev": true } @@ -7925,7 +7925,7 @@ }, "har-validator": { "version": "2.0.6", - "resolved": "http://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", "dev": true, "requires": { @@ -7981,7 +7981,7 @@ }, "request": { "version": "2.79.0", - "resolved": "http://registry.npmjs.org/request/-/request-2.79.0.tgz", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", "dev": true, "requires": { @@ -8202,7 +8202,7 @@ "object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { "define-properties": "^1.1.2", @@ -8343,7 +8343,7 @@ "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "requires": { "execa": "^0.7.0", "lcid": "^1.0.0", @@ -8389,7 +8389,7 @@ "p-map": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha1-5OlPMR6rvIYzoeeZCBZfyiYkG2s=", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", "dev": true }, "p-try": { @@ -8626,7 +8626,7 @@ "anymatch": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, "requires": { "micromatch": "^2.1.5", @@ -8767,7 +8767,7 @@ "pluralize": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha1-KYuJ34uTsCIdv0Ia0rGx6iP8Z3c=" + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" }, "portfinder": { "version": "1.0.24", @@ -8857,7 +8857,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -8891,7 +8891,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -8927,7 +8927,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -8964,7 +8964,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -9000,7 +9000,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -9035,7 +9035,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -9069,7 +9069,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -9109,7 +9109,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -9150,7 +9150,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -9184,7 +9184,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -9218,7 +9218,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -9252,7 +9252,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -9286,7 +9286,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -9321,7 +9321,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -9355,7 +9355,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -9427,7 +9427,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -9481,7 +9481,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -9517,7 +9517,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -9551,7 +9551,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -9589,7 +9589,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -9630,7 +9630,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -9665,7 +9665,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -9702,7 +9702,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -9739,7 +9739,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -9775,7 +9775,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -9872,7 +9872,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -9906,7 +9906,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -9940,7 +9940,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -9977,7 +9977,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -10012,7 +10012,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -10050,7 +10050,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -10086,7 +10086,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -10121,7 +10121,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -10155,7 +10155,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -10191,7 +10191,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -10240,7 +10240,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -10280,7 +10280,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -10324,7 +10324,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -10361,7 +10361,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -10397,7 +10397,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -10438,7 +10438,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -10492,7 +10492,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -10622,7 +10622,7 @@ "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8=" + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" }, "process": { "version": "0.11.10", @@ -10643,7 +10643,7 @@ "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { "asap": "~2.0.3" } @@ -10710,7 +10710,7 @@ "pump": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -10808,7 +10808,7 @@ "randomfill": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "requires": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -10999,7 +10999,7 @@ }, "react-draggable-list": { "version": "3.1.2", - "resolved": "http://registry.npmjs.org/react-draggable-list/-/react-draggable-list-3.1.2.tgz", + "resolved": "https://registry.npmjs.org/react-draggable-list/-/react-draggable-list-3.1.2.tgz", "integrity": "sha1-KjRg7idNOlubTSkGutGjgg1YGP4=", "requires": { "babel-runtime": "^6.18.0", @@ -11101,7 +11101,7 @@ "react-hot-loader": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-3.1.3.tgz", - "integrity": "sha1-b5KHcyaVjHywE0tRJHRReGkSYII=", + "integrity": "sha512-d7nZf78irxoGN5PY4zd6CSgZiroOhvIWzRast3qwTn4sSnBwlt08kV8WMQ9mitmxEdlCTwZt+5ClrRSjxWguMQ==", "dev": true, "requires": { "global": "^4.3.0", @@ -11114,7 +11114,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } @@ -11174,7 +11174,7 @@ "react-pdf": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/react-pdf/-/react-pdf-1.8.3.tgz", - "integrity": "sha1-ExBposH39562V/KNRti+LIbgbPE=", + "integrity": "sha512-kocOp9V52zYpb4jtLJy4DqR94uDJzlldkG2lsy8lJ5HO/97d9IGpXP46pImAgP3b1hBGLaCqYn4aZahpiTll4A==", "requires": { "pdfjs-dist": "^1.8.532", "prop-types": ">=15.5", @@ -11445,7 +11445,7 @@ }, "redux": { "version": "3.6.0", - "resolved": "http://registry.npmjs.org/redux/-/redux-3.6.0.tgz", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.6.0.tgz", "integrity": "sha1-iHwrPQub2G7KK+cFccJ2VMGeGI0=", "requires": { "lodash": "^4.2.1", @@ -11461,7 +11461,7 @@ "redux-form": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/redux-form/-/redux-form-6.8.0.tgz", - "integrity": "sha1-/xtZC1n5h9fj/wgNdS9xIL/kKvM=", + "integrity": "sha512-rISN+EERGB8nAS/LDnOSQaTf0f+QreXEq+7pRVvBFzmH5vIsYRwVpBtYA8UsibGzO+0BL1bl5L5bxdrNwxI+sA==", "requires": { "deep-equal": "^1.0.1", "es6-error": "^4.0.0", @@ -11501,12 +11501,12 @@ "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=" + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" }, "regenerator-transform": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha1-HkmWg3Ix2ot/PPQRTXG1aRoGgN0=", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "requires": { "babel-runtime": "^6.18.0", "babel-types": "^6.19.0", @@ -11516,7 +11516,7 @@ "regex-cache": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { "is-equal-shallow": "^0.1.3" @@ -11525,7 +11525,7 @@ "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" @@ -11767,7 +11767,7 @@ "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=" + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, "rgb": { "version": "0.1.0", @@ -11921,7 +11921,7 @@ }, "load-json-file": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { @@ -11934,7 +11934,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -11963,7 +11963,7 @@ }, "pify": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, @@ -12095,7 +12095,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=" + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "schema-utils": { "version": "0.4.7", @@ -12118,7 +12118,7 @@ "dependencies": { "source-map": { "version": "0.4.4", - "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { @@ -12355,13 +12355,13 @@ "sinon-chai": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz", - "integrity": "sha1-2n3UzIPNaiYLZ8yg96n9riahIF0=", + "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==", "dev": true }, "size-limit": { "version": "0.13.2", "resolved": "https://registry.npmjs.org/size-limit/-/size-limit-0.13.2.tgz", - "integrity": "sha1-7HQ7ZNsFXFJIAfKADeQXvjdC5n8=", + "integrity": "sha512-AAacLFwKA0m1bt8FlB3uUNVxoy9HJ7CyYfVuDs5xFmdiVPb1cXud7bVSdmdj8IcVDf8pYIkFkPYHvrre0EvWhg==", "requires": { "bytes": "^3.0.0", "chalk": "^2.3.0", @@ -12401,7 +12401,7 @@ "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } @@ -12434,12 +12434,12 @@ "commander": { "version": "2.13.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha1-aWS8pnaF33wfFDDFhPB9dZeIW5w=" + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==" }, "cosmiconfig": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-3.1.0.tgz", - "integrity": "sha1-ZAqUv5hH8yGABAPNJzr2BmXHM5c=", + "integrity": "sha512-zedsBhLSbPBms+kE7AH4vHg6JsKDz6epSv2/+5XHs8ILHlgDciSJfSWf8sX9aQ52Jb7KI7VswUTsLpR/G0cr2Q==", "requires": { "is-directory": "^0.3.1", "js-yaml": "^3.9.0", @@ -12521,7 +12521,7 @@ "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "requires": { "pify": "^3.0.0" } @@ -12556,7 +12556,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "strip-ansi": { "version": "4.0.0", @@ -12569,7 +12569,7 @@ "style-loader": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.1.tgz", - "integrity": "sha1-WR/8gLzv4mi3fF2evAUF13Jhn4U=", + "integrity": "sha512-IRE+ijgojrygQi3rsqT0U4dd+UcPCqcVvauZpCnQrGAlEe+FUIyrK93bUDScamesjP08JlQNsFJU+KmPedP5Og==", "requires": { "loader-utils": "^1.0.2", "schema-utils": "^0.3.0" @@ -12586,7 +12586,7 @@ "uglify-es": { "version": "3.3.9", "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha1-DBxPBwC+2NvBJM2zBNJZLKID5nc=", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", "requires": { "commander": "~2.13.0", "source-map": "~0.6.1" @@ -12642,7 +12642,7 @@ "yargs": { "version": "10.1.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", - "integrity": "sha1-RU0HTCsWpRpD4vt4B+T53mnMtcU=", + "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", "requires": { "cliui": "^4.0.0", "decamelize": "^1.1.1", @@ -12715,7 +12715,7 @@ "snapdragon-node": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "requires": { "define-property": "^1.0.0", "isobject": "^3.0.0", @@ -12766,7 +12766,7 @@ "snapdragon-util": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "requires": { "kind-of": "^3.2.0" } @@ -12783,7 +12783,7 @@ "sockjs": { "version": "0.3.19", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha1-2Xa76ACve9IK4IWY1YI5NQiZPA0=", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", "dev": true, "requires": { "faye-websocket": "^0.10.0", @@ -12880,7 +12880,7 @@ "source-map-support": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "requires": { "source-map": "^0.5.6" } @@ -12924,7 +12924,7 @@ "spdx-expression-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -13010,7 +13010,7 @@ "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "requires": { "extend-shallow": "^3.0.0" } @@ -13132,7 +13132,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -13409,7 +13409,7 @@ "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "requires": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -13715,7 +13715,7 @@ "urijs": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.1.tgz", - "integrity": "sha1-Ww/1MMDL3oOG9jQiNbpcpumV0lo=" + "integrity": "sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg==" }, "urix": { "version": "0.1.0", @@ -13741,7 +13741,7 @@ "url-loader": { "version": "0.5.9", "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.5.9.tgz", - "integrity": "sha1-zI/qgse5Bud3cBklCGnlaemVwpU=", + "integrity": "sha512-B7QYFyvv+fOBqBVeefsxv6koWWtjmHaMFT6KZWti4KRw8YUD/hOU+3AECvXuzyVawIBx3z7zQRejXCDSO5kk1Q==", "requires": { "loader-utils": "^1.0.2", "mime": "1.3.x" @@ -13890,7 +13890,7 @@ "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha1-qFWYCx8LazWbodXZ+zmulB+qY60=", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "dev": true }, "webpack": { @@ -14074,7 +14074,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "^1.1.3", "js-base64": "^2.1.9", @@ -14113,7 +14113,7 @@ "dependencies": { "source-map": { "version": "0.4.4", - "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "requires": { "amdefine": ">=0.0.4" @@ -14124,7 +14124,7 @@ "webpack-dev-middleware": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", - "integrity": "sha1-+PwRIM47T8VoDO7LQ9d3lmshEF4=", + "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", "dev": true, "requires": { "memory-fs": "~0.4.1", @@ -14462,7 +14462,7 @@ "websocket-extensions": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha1-XS/yKXcAPsaHpLhwc9+7rBRszyk=" + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" }, "whatwg-encoding": { "version": "1.0.5", @@ -14544,7 +14544,7 @@ "worker-loader": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-1.1.1.tgz", - "integrity": "sha1-kg103axoFvxjU5JlPti0rxkp/ZI=", + "integrity": "sha512-qJZLVS/jMCBITDzPo/RuweYSIG8VJP5P67mP/71alGyTZRe1LYJFdwLjLalY3T5ifx0bMDRD3OB6P2p1escvlg==", "requires": { "loader-utils": "^1.0.0", "schema-utils": "^0.4.0" @@ -14588,7 +14588,7 @@ "ws": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", - "integrity": "sha1-qXm119TaaL9U7+BAiWfDJIaacok=", + "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", "requires": { "async-limiter": "~1.0.0", "safe-buffer": "~5.1.0" diff --git a/package.json b/package.json index 2206b48c5..e61b85eab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "arachne-ui", - "version": "1.15.25", + "version": "1.16.34", "licenses": [ { "type": "Apache-2.0", @@ -46,7 +46,7 @@ "dependencies": { "@ohdsi/atlascharts": "^1.7.3", "@stomp/stompjs": "github:stomp-js/stomp-websocket", - "arachne-ui-components": "1.15.6", + "arachne-ui-components": "1.16.4", "autoprefixer": "^6.7.6", "clamp-js": "^0.7.0", "classnames": "^2.2.5", @@ -54,7 +54,7 @@ "comma-separated-values": "^3.6.4", "compression": "^1.6.0", "core-js": "^2.4.1", - "d3": "^4.9.1", + "d3": "^4.10.0", "d3-scale": "^1.0.6", "d3-selection": "^1.1.0", "d3-tip": "^0.7.1", diff --git a/pom.xml b/pom.xml index 54683cfd4..fc81c48bf 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.odysseusinc.arachne ${final.artifactId} - 1.15.0 + 1.16.0 pom Frontend Resources Bundle diff --git a/src/AppContainer.jsx b/src/AppContainer.jsx index 36c0a95be..73b66c275 100644 --- a/src/AppContainer.jsx +++ b/src/AppContainer.jsx @@ -38,6 +38,7 @@ class AppContainer extends Component { componentDidMount() { if (__APP_TYPE_NODE__) { this.props.getNodeMode(); + this.props.getAuthMode(); } if (__APP_TYPE_CENTRAL__) { this.props.getPasswordPolicies(); @@ -151,6 +152,7 @@ const mapDispatchToProps = { logout: (backurl) => actions.auth.clearToken(backurl), getPasswordPolicies: () => actions.auth.passwordPolicy.find(), getNodeMode: () => (__APP_TYPE_NODE__) ? actions.auth.nodeMode.find() : true, + getAuthMode: () => (__APP_TYPE_NODE__) ? actions.auth.authMode.find() : true }; export default (navItems) => { diff --git a/src/bootstrap.jsx b/src/bootstrap.jsx index 5faeb6c10..7b97cd365 100644 --- a/src/bootstrap.jsx +++ b/src/bootstrap.jsx @@ -35,6 +35,7 @@ import React from 'react'; import NotFound from 'components/NotFound'; import pluralize from 'pluralize'; import AppContainer from './AppContainer'; +import { authenticationModes } from 'modules/Auth/const'; require('styles/appContainer.scss'); @@ -147,7 +148,9 @@ function initializeApi(store) { .setUserTokenGetter(() => AuthService.getToken()) .setUserRequestedGetter(() => AuthService.getUserRequest()) .setUnauthorizedHandler(() => { - if (store.getState().auth.principal.queryResult !== null) { + if (!!store.getState().auth.authMode.data && store.getState().auth.authMode.data.result.mode == authenticationModes.Proxy) { + window.location = '/_gcp_iap/clear_login_cookie'; + } else if (store.getState().auth.principal.queryResult !== null) { store.dispatch(actions.auth.clearToken(store.getState().routing.locationBeforeTransitions.pathname)); } }); diff --git a/src/components/Comment/style.scss b/src/components/Comment/style.scss index 8958df510..c2f452610 100644 --- a/src/components/Comment/style.scss +++ b/src/components/Comment/style.scss @@ -58,10 +58,11 @@ &__description { line-height: 1.5; margin-top: 5px; + word-break: break-all; } &__actions { - margin-top: 5px; + margin-top: 5px; } &__action { diff --git a/src/components/VirtualScroller/components/List/style.scss b/src/components/VirtualScroller/components/List/style.scss index fe5ab5362..4558799d5 100644 --- a/src/components/VirtualScroller/components/List/style.scss +++ b/src/components/VirtualScroller/components/List/style.scss @@ -21,8 +21,8 @@ */ @import 'styles/vars-and-mixins.scss'; - -.#{$namespace} { + +.#{$namespace} { &virtual-list { & .react-grid-Header { display: none; @@ -33,6 +33,10 @@ /* compensate hidden header */ top: 0 !important; } + + & .react-grid-Canvas { + max-height: 40rem; + } } } - + diff --git a/src/modules/Admin/components/AdminList/ModalAddUser/style.scss b/src/modules/Admin/components/AdminList/ModalAddUser/style.scss index 8b462fe89..e7e350181 100644 --- a/src/modules/Admin/components/AdminList/ModalAddUser/style.scss +++ b/src/modules/Admin/components/AdminList/ModalAddUser/style.scss @@ -36,4 +36,4 @@ $width: 26rem; } } -} \ No newline at end of file + } \ No newline at end of file diff --git a/src/modules/Admin/components/AdminList/presenter.jsx b/src/modules/Admin/components/AdminList/presenter.jsx index a3dee92b3..f54737e7c 100644 --- a/src/modules/Admin/components/AdminList/presenter.jsx +++ b/src/modules/Admin/components/AdminList/presenter.jsx @@ -28,22 +28,25 @@ import ModalAddUser from './ModalAddUser'; import { LoadingPanel, } from 'arachne-ui-components'; +import ProtectedView from 'modules/Admin/components/ProtectedView'; require('./style.scss'); -function AdminList({ isLoading, openModal, isStandalone }) { +function AdminList({ isLoading, openModal, isStandalone}) { const classes = new BEMHelper('admin-panel-admin-list'); return ( - - - { !isStandalone && (
- add_circle_outline - Add admin user -
) } - - - + + +
+ { !isStandalone && (
+ add_circle_outline + Add admin user +
) } + + + + ); } diff --git a/src/modules/Admin/components/PortalUserList/Filters/fields.js b/src/modules/Admin/components/PortalUserList/Filters/fields.js index f09fb1307..5795e7910 100644 --- a/src/modules/Admin/components/PortalUserList/Filters/fields.js +++ b/src/modules/Admin/components/PortalUserList/Filters/fields.js @@ -20,23 +20,31 @@ * */ -import { types as fieldTypes } from 'const/modelAttributes'; +import {types as fieldTypes} from 'const/modelAttributes'; export default function getFields(props) { return [ { - label: 'Enabled', + label: 'Status', name: 'enabled', - type: fieldTypes.toggle, + type: fieldTypes.enum, forceOpened: true, - hasTitle: false + hasTitle: true, + options: [ + {label: 'Enabled', value: 'true',}, + {label: 'Disabled', value: 'false',}, + ], }, { - label: 'E-mail confirm', + label: 'E-mail confirmed', name: 'emailConfirmed', - type: fieldTypes.toggle, + type: fieldTypes.enum, forceOpened: true, - hasTitle: false + hasTitle: true, + options: [ + {label: 'Yes', value: 'true',}, + {label: 'No', value: 'false',}, + ] }, { label: 'Tenant', diff --git a/src/modules/Admin/components/PortalUserList/Table/ActionsToolbar/presenter.jsx b/src/modules/Admin/components/PortalUserList/Table/ActionsToolbar/presenter.jsx index ee36fb7f2..5cc3c3129 100644 --- a/src/modules/Admin/components/PortalUserList/Table/ActionsToolbar/presenter.jsx +++ b/src/modules/Admin/components/PortalUserList/Table/ActionsToolbar/presenter.jsx @@ -23,18 +23,18 @@ import isEmpty from 'lodash/isEmpty'; import React, { Component } from 'react'; import { Button } from 'arachne-ui-components'; import { batchOperationType } from 'modules/Admin/const'; -import pluralize from 'pluralize'; +import { formatNumberWithLabel } from 'services/Utils'; require('./style.scss'); /** @augments{ Component} */ export default class ActionsToolbar extends Component{ - + getButtons() { - + const areUndeletableUsersSelected = !isEmpty(this.props.selectedUndeletableUsers); - + return [ { onClick: this.props.openAddUsersBatchModal, @@ -58,7 +58,7 @@ export default class ActionsToolbar extends Component{ }), this.createButton({ onClick: areUndeletableUsersSelected ? () => {} : this.props.batch.bind(null, batchOperationType.DELETE), - tooltipText: areUndeletableUsersSelected ? `${pluralize('user', this.props.selectedUndeletableUsers.length, true)} cannot be deleted` : 'Delete', + tooltipText: this.buildDeleteUsersTooltipMessage(areUndeletableUsersSelected), icon: 'delete', mods: { invalid: areUndeletableUsersSelected} }), @@ -66,7 +66,7 @@ export default class ActionsToolbar extends Component{ } createButton({ onClick, tooltipText, icon, mods = {} }) { - + const areUsersSelected = !isEmpty(this.props.selectedUsers); return { disabled: !areUsersSelected, @@ -76,20 +76,30 @@ export default class ActionsToolbar extends Component{ mods, } } - + + buildDeleteUsersTooltipMessage(areUndeletableUsersSelected) { + + if (areUndeletableUsersSelected) { + const count = this.props.selectedUndeletableUsers.length; + const have = count === 1 ? 'has' : 'have'; + const errorMessage = `${formatNumberWithLabel({ label: 'user', value: count })} ${have} records and cannot be removed`; + return errorMessage; + } + return 'Delete'; + } render() { const classes = new BEMHelper('admin-portal-user-list-actions-toolbar'); const tooltipClass = new BEMHelper('tooltip'); - + const selectedUsers = this.props.selectedUsers.length; return (
{ this.getButtons().map(buttonSettings =>
- {`Selected ${pluralize('user', this.props.selectedUsers.length, true)}`} + {`Selected ${formatNumberWithLabel({ label: 'user', value: selectedUsers })}`}
); } diff --git a/src/modules/Admin/components/PortalUserList/presenter.jsx b/src/modules/Admin/components/PortalUserList/presenter.jsx index 7d3571bea..ca968e0ba 100644 --- a/src/modules/Admin/components/PortalUserList/presenter.jsx +++ b/src/modules/Admin/components/PortalUserList/presenter.jsx @@ -27,6 +27,7 @@ import ModalAddUser from './ModalAddUser'; import ModalAddUserBatch from './ModalAddUserBatch'; import Grid from 'components/Grid'; import PortalUserListActions from './Actions'; +import ProtectedView from 'modules/Admin/components/ProtectedView'; require('./style.scss'); @@ -46,21 +47,23 @@ export default class UserList extends Component { onPageOutOfRange, } = this.props; return ( - - } - searchQueryDecode={searchQueryDecode} - searchQueryEncode={searchQueryEncode} - onPageOutOfRange={onPageOutOfRange} - > -
- - { this.getModals() } - + + + } + searchQueryDecode={searchQueryDecode} + searchQueryEncode={searchQueryEncode} + onPageOutOfRange={onPageOutOfRange} + > +
+ + { this.getModals() } + + ); } } diff --git a/src/modules/Admin/components/ProtectedView/container.jsx b/src/modules/Admin/components/ProtectedView/container.jsx new file mode 100644 index 000000000..b37f19ed5 --- /dev/null +++ b/src/modules/Admin/components/ProtectedView/container.jsx @@ -0,0 +1,56 @@ +/* + * + * Copyright 2018 Odysseus Data Services, inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Company: Odysseus Data Services, Inc. + * Product Owner/Architecture: Gregory Klebanov + * Authors: Anastasiia Klochkova + * Created: December 09, 2019 + * + */ + +import { Component } from 'react'; +import { get, ContainerBuilder } from 'services/Utils'; +import ProtectedViewPresenter from './presenter'; + + +class ProtectedView extends Component { + + render() { + return ProtectedViewPresenter({ + ...this.props, + }); + } +} + +class ProtectedViewBuilder extends ContainerBuilder { + getComponent() { + return ProtectedView; + } + + mapStateToProps(state) { + return { + isAdmin: get(state, 'auth.principal.queryResult.result.isAdmin'), + }; + } + + mergeProps(stateProps, dispatchProps, ownProps) { + return { + ...stateProps, + ...dispatchProps, + ...ownProps, + }; + } +} +export default ProtectedViewBuilder; diff --git a/src/modules/Admin/components/ProtectedView/index.js b/src/modules/Admin/components/ProtectedView/index.js new file mode 100644 index 000000000..cc90d7847 --- /dev/null +++ b/src/modules/Admin/components/ProtectedView/index.js @@ -0,0 +1,25 @@ +/* + * + * Copyright 2018 Odysseus Data Services, inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Company: Odysseus Data Services, Inc. + * Product Owner/Architecture: Gregory Klebanov + * Authors: Anastasiia Klochkova + * Created: December 09, 2019 + * + */ + +import ProtectedViewBuilder from './container'; + +export default new ProtectedViewBuilder().build(); diff --git a/src/modules/Admin/components/ProtectedView/presenter.jsx b/src/modules/Admin/components/ProtectedView/presenter.jsx new file mode 100644 index 000000000..e19c8c34a --- /dev/null +++ b/src/modules/Admin/components/ProtectedView/presenter.jsx @@ -0,0 +1,42 @@ +/* + * + * Copyright 2018 Odysseus Data Services, inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Company: Odysseus Data Services, Inc. + * Product Owner/Architecture: Gregory Klebanov + * Authors: Anastasiia Klochkova + * Created: December 09, 2019 + * + */ + +import React from 'react'; +import BEMHelper from 'services/BemHelper'; + +require('./style.scss'); + +function ProtectedView(props) { + const { children, isAdmin } = props; + const classes = new BEMHelper('admin-settings-warning'); + if (!isAdmin) { + return
The page you're looking for can't be found
; + } + return ( +
+ {children} +
+ ); +} + + +export default ProtectedView; \ No newline at end of file diff --git a/src/modules/Admin/components/ProtectedView/style.scss b/src/modules/Admin/components/ProtectedView/style.scss new file mode 100644 index 000000000..605661a84 --- /dev/null +++ b/src/modules/Admin/components/ProtectedView/style.scss @@ -0,0 +1,40 @@ +/* + * + * Copyright 2018 Odysseus Data Services, inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Company: Odysseus Data Services, Inc. + * Product Owner/Architecture: Gregory Klebanov + * Authors: Anastasiia Klochkova + * Created: December 09, 2019 + * + */ + +@import 'styles/vars-and-mixins.scss'; + +.#{$namespace} { + + &admin-settings-warning { + + display: flex; + height: 100%; + width: 100%; + + &__access-denied-title { + width: 100%; + text-align: center; + margin-top: 15rem; + font-size: 2.5rem; + } + } +} \ No newline at end of file diff --git a/src/modules/Admin/components/SystemSettings/presenter.jsx b/src/modules/Admin/components/SystemSettings/presenter.jsx index 9408b4f76..c314db0c6 100644 --- a/src/modules/Admin/components/SystemSettings/presenter.jsx +++ b/src/modules/Admin/components/SystemSettings/presenter.jsx @@ -31,6 +31,7 @@ import { LoadingPanel, } from 'arachne-ui-components'; import { get } from 'services/Utils'; +import ProtectedView from 'modules/Admin/components/ProtectedView'; require('./style.scss'); @@ -69,78 +70,80 @@ function SystemSettings(props) { }) return ( - -
- {!isApplied && -
- - Some settings were changed, but have not been applied yet. To apply settings, you need to restart server. - -
- } - {__APP_TYPE_CENTRAL__ - ? -
-
-
-
-
-
-
-
-
-
-
+ } + {__APP_TYPE_CENTRAL__ + ? +
+
+
+
+
+
+
+
+
+
+
+ : null + } +
+
+ {formComponentList}
- : null - } -
-
- {formComponentList}
-
- - + + + ); } diff --git a/src/modules/AnalysisExecution/components/SubmissionCodeViewer/ResultFile/components/Summary/Pathway/container.js b/src/modules/AnalysisExecution/components/SubmissionCodeViewer/ResultFile/components/Summary/Pathway/container.js new file mode 100644 index 000000000..78488def2 --- /dev/null +++ b/src/modules/AnalysisExecution/components/SubmissionCodeViewer/ResultFile/components/Summary/Pathway/container.js @@ -0,0 +1,55 @@ +/* + * + * Copyright 2017 Observational Health Data Sciences and Informatics + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Company: Odysseus Data Services, Inc. + * Product Owner/Architecture: Gregory Klebanov + * Authors: Pavel Grafkin, Alexander Saltykov, Vitaly Koulakov, Anton Gackovka, Alexandr Ryabokon, Mikhail Mironov + * Created: Apr 24, 2019 + * + */ + +import { ContainerBuilder, get } from 'services/Utils'; +import SummaryPathway from './presenter'; +import { sunburst } from '@ohdsi/atlascharts/dist/atlascharts.umd'; +import PathwaySummarySelectorsBuilder from './selectors'; +import actions from 'actions'; + +const selectors = (new PathwaySummarySelectorsBuilder()).build(); + +export default class SummayPathwayBuilder extends ContainerBuilder { + + getComponent() { + return SummaryPathway; + } + + mapStateToProps(state, ownProps) + { + const details = get(state, 'analysisExecution.pathwaySummary.details', [], 'Array'); + + return { + pathways: selectors.getPathways(state), + sunburstChart: new sunburst(), + details, + }; + } + + getMapDispatchToProps() + { + return { + loadPathwayDetails: actions.analysisExecution.pathwaySummary.getDetails, + }; + } + +}; \ No newline at end of file diff --git a/src/modules/AnalysisExecution/components/SubmissionCodeViewer/ResultFile/components/Summary/Pathway/index.js b/src/modules/AnalysisExecution/components/SubmissionCodeViewer/ResultFile/components/Summary/Pathway/index.js new file mode 100644 index 000000000..759a88d03 --- /dev/null +++ b/src/modules/AnalysisExecution/components/SubmissionCodeViewer/ResultFile/components/Summary/Pathway/index.js @@ -0,0 +1,25 @@ +/* + * + * Copyright 2017 Observational Health Data Sciences and Informatics + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Company: Odysseus Data Services, Inc. + * Product Owner/Architecture: Gregory Klebanov + * Authors: Pavel Grafkin, Alexander Saltykov, Vitaly Koulakov, Anton Gackovka, Alexandr Ryabokon, Mikhail Mironov + * Created: Apr 24, 2019 + * + */ + +import SummaryPathwayBuilder from './container'; + +export default (new SummaryPathwayBuilder()).build(); \ No newline at end of file diff --git a/src/modules/AnalysisExecution/components/SubmissionCodeViewer/ResultFile/components/Summary/Pathway/presenter.jsx b/src/modules/AnalysisExecution/components/SubmissionCodeViewer/ResultFile/components/Summary/Pathway/presenter.jsx new file mode 100644 index 000000000..0c2fdeb2d --- /dev/null +++ b/src/modules/AnalysisExecution/components/SubmissionCodeViewer/ResultFile/components/Summary/Pathway/presenter.jsx @@ -0,0 +1,119 @@ +/* + * + * Copyright 2017 Observational Health Data Sciences and Informatics + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Company: Odysseus Data Services, Inc. + * Product Owner/Architecture: Gregory Klebanov + * Authors: Pavel Grafkin, Alexander Saltykov, Vitaly Koulakov, Anton Gackovka, Alexandr Ryabokon, Mikhail Mironov + * Created: Apr 24, 2019 + * + */ + +import React from 'react'; +import BEMHelper from 'services/BemHelper'; +import './style.scss'; +import { sunburst } from '@ohdsi/atlascharts/dist/atlascharts.umd'; +import { chartSettings } from 'modules/DataCatalog/const'; +import Chart from 'components/Reports/Chart'; +import { Panel, Table, TableCellText } from 'arachne-ui-components'; +import * as d3 from 'd3'; + +function tooltipBuilder({ path }) { + const classes = BEMHelper('summary-pathway-tooltip'); + const nameBuilder = (name, color) => `${name}`; + const stepBuilder = (step) => `
${step.names.map(n => nameBuilder(n.name, n.color)).join("")}
`; + + return `
${path.map(s => stepBuilder(s)).join("")}
`; +} + +function formatPct(val) { + return d3.format(".1%")(val); +} + +function PathNameCell({ className, mods, value }) { + const classes = BEMHelper('pathname-cell'); + return ({value}); +} + +export default function SummaryPathway({ className, pathways, sunburstChart, loadPathwayDetails, details }) { + const classes = BEMHelper('summary-pathway'); + + return ( +
+
+ {pathways.map((pathway, i) => { + return ( +
+
+ +
+
Target cohort
+
{pathway.targetCohortName}
+
    +
  • Target cohort count: {pathway.targetCohortCount}
  • +
  • Persons with pathways count: {pathway.personsReported}
  • +
  • Persons with pathways portion: { formatPct(pathway.personsReportedPct) }
  • +
+
+
+
Event cohorts
+ {pathway.eventCodes.map(ec => { + return ( +
+
+
{ec.name}
+
+ ); + })} +
+
+ +
+
+ names.map(n => n.name).join(", ")} /> + formatPct(pct)} /> + formatPct(pct)} /> +
+ + + + 0 } + render = {({width, element}) => { + sunburstChart.render(pathway.pathway, element, width, width * 0.5, + { + minHeight: 300, + tipClass: 'pathway-tip', + tooltip: (d) => { + const path = pathway.tooltips(d); + return tooltipBuilder({ path }); + }, + useTip: true, + colors: pathway.colors, + onclick: (node) => { sunburstChart.destroyTipIfExists(); loadPathwayDetails({ pathway, node }); }, + split: pathway.splitPathway, + ...chartSettings, + }); + }} + /> + + ) + })} + + + ) +}; \ No newline at end of file diff --git a/src/modules/AnalysisExecution/components/SubmissionCodeViewer/ResultFile/components/Summary/Pathway/selectors.js b/src/modules/AnalysisExecution/components/SubmissionCodeViewer/ResultFile/components/Summary/Pathway/selectors.js new file mode 100644 index 000000000..cc636d683 --- /dev/null +++ b/src/modules/AnalysisExecution/components/SubmissionCodeViewer/ResultFile/components/Summary/Pathway/selectors.js @@ -0,0 +1,139 @@ +/* + * + * Copyright 2017 Observational Health Data Sciences and Informatics + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Company: Odysseus Data Services, Inc. + * Product Owner/Architecture: Gregory Klebanov + * Authors: Pavel Grafkin, Alexander Saltykov, Vitaly Koulakov, Anton Gackovka, Alexandr Ryabokon, Mikhail Mironov + * Created: May 6, 2019 + * + */ + +import { get } from 'services/Utils'; +import { createSelector } from 'reselect'; +import { util } from '@ohdsi/atlascharts/dist/atlascharts.umd'; +import * as d3 from 'd3'; + +class PathwaySummarySelectorsBuilder { + + buildHierarchy(pathways) { + return util.buildHierarchy(pathways, d => d.path, d => d.personCount); + } + + sumChildren(node) { + return node.children ? node.children.reduce((r, n) => r + this.sumChildren(n),0) : node.size; + } + + summarizeHierarchy(pathway) { + return { totalPathways: this.sumChildren(pathway) }; + } + + getRawPathwayGroups(state) { + return get(state, 'analysisExecution.submissionSummary.submission.data.resultInfo.pathwayGroups', [], 'Array'); + } + + getRawDesign(state) { + return get(state, 'analysisExecution.submissionSummary.submission.data.resultInfo.design', {}, 'Object'); + } + + getRawEventCodes(state) { + return get(state, 'analysisExecution.submissionSummary.submission.data.resultInfo.eventCodes', [], 'Array'); + } + + buildSelectorForPathways() { + return createSelector([this.getRawPathwayGroups, this.getRawEventCodes, this.getRawDesign], + (pathwayGroups, eventCodes, design) => pathwayGroups.map(pathwayGroup => { + if (!pathwayGroup.pathways) { + return null; + } + pathwayGroup.pathways.forEach(pw => { + if (pw.path.split("-").length < design.maxDepth) { + pw.path = pw.path + "-end"; + } + }); + const pathway = this.buildHierarchy(pathwayGroup.pathways); + const targetCohort = design.targetCohorts.find(c => pathwayGroup.targetCohortId); + const summary = {...this.summarizeHierarchy(pathway), cohortPersons: pathwayGroup.targetCohortCount, pathwayPersons: pathwayGroup.totalPathwaysCount}; + const eventCohorts = eventCodes.filter(ec => !ec.isCombo) + const colorScheme = d3.scaleOrdinal(eventCohorts.length > 10 ? d3.schemeCategory20 : d3.schemeCategory10); + const fixedColors = {"end": "rgba(185, 184, 184, 0.23)"}; + const colors = (d) => (fixedColors[d] || colorScheme(d)); + + const getAncestors = (node) => { + var path = []; + var current = node; + while (current.parent) { + path.unshift(current); + current = current.parent; + } + return path; + }; + + const getPathToNode = (node) => { + let ancestors = getAncestors(node); + let pathway = ancestors.map(p => (p.data.name == "end") ? {names: [{name: "end", color: colors("end")}], count: p.value} : { + names: eventCohorts.filter(c => (c.code & Number.parseInt(p.data.name)) > 0) + .map(ec => ({name: ec.name, color: colors(ec.code)})), count: p.value}); + return pathway; + }; + + const splitPathway = (node) => { + if (isNaN(node.data.name)) { + return [node]; + }; + + let splitNodes = [...Number.parseInt(node.data.name).toString(2)].reverse().reduce((result, bit, i) => { + if (bit == "1") { + let nodeClone = Object.assign({}, node); + nodeClone.data = {name: (1< { + node.y0 = node.y0 + (i * bandWidth); + node.y1 = node.y0 + bandWidth; + return node; + }) + }; + + const tooltips = (d) => getPathToNode(d); + return { + pathway, + tooltips, + targetCohortName: targetCohort.name, + targetCohortCount: summary.cohortPersons, + personsReported: summary.pathwayPersons, + personsReportedPct: summary.pathwayPersons / summary.cohortPersons, + eventCodes: eventCohorts, + summary, + colors, + getPathToNode, + splitPathway, + }; + }).filter(v => !!v) + ); + } + + build() { + return { + getPathways: this.buildSelectorForPathways(), + }; + } +} + +export default PathwaySummarySelectorsBuilder; diff --git a/src/modules/AnalysisExecution/components/SubmissionCodeViewer/ResultFile/components/Summary/Pathway/style.scss b/src/modules/AnalysisExecution/components/SubmissionCodeViewer/ResultFile/components/Summary/Pathway/style.scss new file mode 100644 index 000000000..6c70dfccd --- /dev/null +++ b/src/modules/AnalysisExecution/components/SubmissionCodeViewer/ResultFile/components/Summary/Pathway/style.scss @@ -0,0 +1,89 @@ +/*! + * + * Copyright 2017 Observational Health Data Sciences and Informatics + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Company: Odysseus Data Services, Inc. + * Product Owner/Architecture: Gregory Klebanov + * Authors: Pavel Grafkin, Alexander Saltykov, Vitaly Koulakov, Anton Gackovka, Alexandr Ryabokon, Mikhail Mironov + * Created: Apr 24, 2019 + * + */ + +@import 'styles/vars-and-mixins.scss'; + +.#{$namespace} { + &summary-pathway { + @include summary-result-block(); + @include bordered-table(); + + display: flex; + + &__result-info { + display: initial; + border-top: 1px solid $grey-medium; + width: 100%; + } + + &__chart { + flex-grow: 1; + margin-top: 0; + &__panel-header { + margin-top: 0; + } + &__panel-content { + margin-top: 2rem; + } + } + + &__legend-section { + padding: 1rem; + + h5 { + font-size: 1.6rem; + border-bottom: 1px #a0a0a0 solid; + margin-bottom: 0.5rem; + } + li { + padding: 0.5rem 0; + span { + font-weight: bold; + } + } + } + &__cohort-name { + margin-bottom: 1rem; + font-weight: bolder; + } + &__legend-symbol { + width: 1rem; + height: 1rem; + margin-right: 1.5rem; + } + &__cell-name { + width: 17rem; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; + } + } +} + +.pathway-tip { + padding: 5px; + border-radius: 4px; + background-color: white; + border: solid 1px black; +} diff --git a/src/modules/AnalysisExecution/components/SubmissionCodeViewer/ResultFile/components/Summary/presenter.jsx b/src/modules/AnalysisExecution/components/SubmissionCodeViewer/ResultFile/components/Summary/presenter.jsx index 1816d07d1..f8b585a6e 100644 --- a/src/modules/AnalysisExecution/components/SubmissionCodeViewer/ResultFile/components/Summary/presenter.jsx +++ b/src/modules/AnalysisExecution/components/SubmissionCodeViewer/ResultFile/components/Summary/presenter.jsx @@ -35,6 +35,7 @@ import isEmpty from 'lodash/isEmpty'; import SummaryIncidence from './Incidence'; import SummaryCohort from './Cohort'; import SummaryPopulationLevel from './PopulationLevel'; +import SummaryPathway from './Pathway'; import './style.scss'; @@ -88,6 +89,12 @@ export default function SubmissionResultSummary(props) { specificSummaryMods.padded = false; specificSummary = ; break; + case analysisTypes.COHORT_PATHWAY: + specificSummaryMods.narrow = false; + specificSummaryMods.wide = true; + specificSummaryMods.padded = false; + specificSummary = ; + break; } const statusMods = get(submission, 'status.value') ? statusColors[get(submission, 'status.value', '')] : null; diff --git a/src/modules/AnalysisExecution/components/ViewEditAnalysis/DataSources/presenter.jsx b/src/modules/AnalysisExecution/components/ViewEditAnalysis/DataSources/presenter.jsx index ebf34acfc..cd0776958 100644 --- a/src/modules/AnalysisExecution/components/ViewEditAnalysis/DataSources/presenter.jsx +++ b/src/modules/AnalysisExecution/components/ViewEditAnalysis/DataSources/presenter.jsx @@ -58,12 +58,14 @@ function DataSource({ options, input }) { data-tootik-conf="right" > - input.onChange(!input.value)} > - {options.label} - + + {options.label} + + ); } @@ -76,7 +78,7 @@ function DataSources(props) { } = props; return (
    - {dataSources && dataSources.map((dataSource, key) => + {dataSources && dataSources.map((dataSource, key) => } */ export default class ListCodeBuilder { - getComponent() { - return ListCode; - } + getComponent() { + return ListCode; + } - mapStateToProps(state) { - const analysisData = get(state, 'analysisExecution.analysis.data.result'); - const analysisId = get(analysisData, 'id'); - const analysisType = get(analysisData, 'type.id'); - const codeList = selectors.getCodeList(state); - const downloadAllLink = apiPaths.analysisCodeDownloadAll({ analysisId }); - const isLocked = get(analysisData, 'locked'); + mapStateToProps(state) { + const analysisData = get(state, 'analysisExecution.analysis.data.result'); + const analysisId = get(analysisData, 'id'); + const analysisType = get(analysisData, 'type.id'); + const codeList = selectors.getCodeList(state); + const downloadAllLink = apiPaths.analysisCodeDownloadAll({analysisId}); + const isLocked = get(analysisData, 'locked'); - const permissions = get(analysisData, 'permissions', {}); - const isSubmittable = get(permissions, analysisPermissions.createSubmission, false); - const canAddFiles = get(permissions, analysisPermissions.uploadAnalysisFiles, false); + const permissions = get(analysisData, 'permissions', {}); + const isSubmittable = get(permissions, analysisPermissions.createSubmission, false); + const canAddFiles = get(permissions, analysisPermissions.uploadAnalysisFiles, false); - const canSubmit = codeList.length > 0; - const isLoading = selectors.getIsLoading(state); + const canSubmit = codeList.length > 0; + const isLoading = selectors.getIsLoading(state); - return { - analysisId, - analysisType, - codeList, - downloadAllLink, - isSubmittable, - isLocked, - isLoading, - canSubmit, - canAddFiles, - isExecutableSelected: codeList.find(file => file.isExecutable), - }; - } + return { + analysisId, + analysisType, + codeList, + downloadAllLink, + isSubmittable, + isLocked, + isLoading, + canSubmit, + canAddFiles, + isExecutableSelected: codeList.find(file => file.isExecutable), + }; + } - getMapDispatchToProps() { - return { - openCreateCodeModal: activeSection => ModalUtils.actions.toggle(modal.createCode, true, { activeSection }), - openSubmitModal: ModalUtils.actions.toggle.bind(null, modal.submitCode, true), - loadAnalysis: actions.analysisExecution.analysis.find, - removeCode: actions.analysisExecution.code.delete, - reimportCode: actions.analysisExecution.importEntity.update, - }; - } + getMapDispatchToProps() { + return { + openCreateCodeModal: activeSection => ModalUtils.actions.toggle(modal.createCode, true, {activeSection}), + openUpdateDescriptionModal: newDescription => ModalUtils.actions.toggle(modal.updateAnalysisDescription, true, {newDescription}), + openSubmitModal: ModalUtils.actions.toggle.bind(null, modal.submitCode, true), + loadAnalysis: actions.analysisExecution.analysis.find, + removeCode: actions.analysisExecution.code.delete, + reimportCode: actions.analysisExecution.importEntity.update, + }; + } - mergeProps(stateProps, dispatchProps, ownProps) { - return { - ...ownProps, - ...stateProps, - ...dispatchProps, - reimportCode(analysisCodeId) { - dispatchProps - .reimportCode({ - analysisId: stateProps.analysisId, - fileId: analysisCodeId, - type: stateProps.analysisType, - }) - .then(() => dispatchProps.loadAnalysis({ id: stateProps.analysisId })); - }, - removeCode(analysisCodeId) { - Utils.confirmDelete({ - message: 'Are you sure you want to delete this file?', - }) - .then(() => { - dispatchProps - .removeCode({ analysisId: stateProps.analysisId, analysisCodeId }) - .then(() => dispatchProps.loadAnalysis({ id: stateProps.analysisId })); - }); - }, - }; - } + mergeProps(stateProps, dispatchProps, ownProps) { + return { + ...ownProps, + ...stateProps, + ...dispatchProps, + async reimportCode(analysisCodeId) { - build() { - return Utils.buildConnectedComponent({ - Component: this.getComponent(), - mapStateToProps: this.mapStateToProps, - mapDispatchToProps: this.getMapDispatchToProps(), - mergeProps: this.mergeProps, - }); - } + const reimportResult = await dispatchProps + .reimportCode({ + analysisId: stateProps.analysisId, + fileId: analysisCodeId, + type: stateProps.analysisType, + }); + + const newDescription = reimportResult.result; + if (!!newDescription) { + await dispatchProps.openUpdateDescriptionModal(newDescription); + } + await dispatchProps.loadAnalysis({id: stateProps.analysisId}); + }, + async removeCode(analysisCodeId) { + await Utils.confirmDelete({ + message: 'Are you sure you want to delete this file?', + }); + + await dispatchProps.removeCode({analysisId: stateProps.analysisId, analysisCodeId}); + await dispatchProps.loadAnalysis({id: stateProps.analysisId}); + }, + }; + } + + build() { + return Utils.buildConnectedComponent({ + Component: this.getComponent(), + mapStateToProps: this.mapStateToProps, + mapDispatchToProps: this.getMapDispatchToProps(), + mergeProps: this.mergeProps, + }); + } } diff --git a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ListSubmissions/Results/presenter.jsx b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ListSubmissions/Results/presenter.jsx index 1f0ef4dbb..985cf306d 100644 --- a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ListSubmissions/Results/presenter.jsx +++ b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ListSubmissions/Results/presenter.jsx @@ -23,10 +23,7 @@ import React, { Component } from 'react'; import BEMHelper from 'services/BemHelper'; import { get } from 'services/Utils'; -import { numberFormatter } from 'services/Utils'; -import pluralize from 'pluralize'; -import min from 'lodash/min'; -import max from 'lodash/max'; +import { formatNumberWithLabel } from 'services/Utils'; require('./style.scss'); @@ -43,23 +40,28 @@ export default class Results extends Component { Cohort = () => { const persons = get(this.props.resultInfo, 'persons'); - return ; + const string = formatNumberWithLabel({ label: 'person', value: persons }); + return ; }; Default = () => { - return ; + const documents = this.props.resultFilesCount; + const string = formatNumberWithLabel({ label: 'document', value: documents }); + return ; }; CohortHeracles = () => { const { resultInfo } = this.props; const persons = get(resultInfo, 'persons') || 0; const reports = get(resultInfo, 'reports') || 0; - return ; + const string = `${formatNumberWithLabel({ label: 'person', value: persons })}, ${formatNumberWithLabel({ label: 'report', value: reports })}`; + return ; }; CohortCharacterization = () => { const reports = get(this.props.resultInfo, 'reports') || 0; - return ; + const string = formatNumberWithLabel({ label: 'report', value: reports }); + return ; }; Incidence = () => { @@ -74,12 +76,12 @@ export default class Results extends Component { const persons = resultInfo.map(o => o.PERSON_COUNT); const timesAtRisk = resultInfo.map(o => o.TIME_AT_RISK); const proportions = resultInfo.map(o => o.PROPORTION); - tooltipString = `Rate: ${min(rates)} - ${max(rates)} - Cases: ${min(cases)} - ${max(cases)} - Persons: ${min(persons)} - ${max(persons)} - Time at risk: ${min(timesAtRisk)} - ${max(timesAtRisk)} - Proportion: ${min(proportions)} - ${max(proportions)}`; - label = `${resultInfo.length} ${pluralize('combination', resultInfo.length)}`; + tooltipString = `Rate: ${formatNumberWithLabel({ value: rates, range: true, withoutLabel: true })} + Cases: ${formatNumberWithLabel({ value: cases, range: true, withoutLabel: true })} + Persons: ${formatNumberWithLabel({ value: persons, range: true, withoutLabel: true })} + Time at risk: ${formatNumberWithLabel({ value: timesAtRisk, range: true, withoutLabel: true })} + Proportion: ${formatNumberWithLabel({ value: proportions, range: true, withoutLabel: true })}`; + label = formatNumberWithLabel({ label: 'combination', value: resultInfo.length }); } else if (Array.isArray(resultInfo) && resultInfo.length === 1) { const entry = resultInfo[0]; const personCount = get(entry, 'PERSON_COUNT') || 0; @@ -87,12 +89,12 @@ export default class Results extends Component { const cases = get(entry, 'CASES') || 0; const rate = get(entry, 'RATE') || 0; const proportion = get(entry, 'PROPORTION') || 0; - tooltipString = `Rate: ${rate} - ${pluralize('Case', cases)}: ${cases} - ${pluralize('Person', personCount)}: ${personCount} - Time at risk: ${timeAtRisk} - Proportion: ${proportion}`; - label = `${numberFormatter.format(cases, 'short')} ${pluralize('case', cases)}, ${numberFormatter.format(personCount, 'short')} ${pluralize('person', personCount)}`; + tooltipString = `Rate: ${formatNumberWithLabel({ value: rate, withoutLabel: true })} + ${formatNumberWithLabel({ value: cases, label: 'Case', pre: true })} + ${formatNumberWithLabel({ value: personCount, label: 'Person', pre: true })} + Time at risk: ${formatNumberWithLabel({ value: timeAtRisk, withoutLabel: true })} + Proportion: ${formatNumberWithLabel({ value: proportion, withoutLabel: true })}`; + label = `${formatNumberWithLabel({ label: 'case', value: cases, format: 'short' })}, ${formatNumberWithLabel({ label: 'person', value: personCount, format: 'short' })}`; } else { return this.Default(); } diff --git a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/ImportList/container.js b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/ImportList/container.js index 107be80d1..d8e3a842f 100644 --- a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/ImportList/container.js +++ b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/ImportList/container.js @@ -22,118 +22,129 @@ import { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; -import { - reduxForm, - reset as resetForm, -} from 'redux-form'; +import { reduxForm, reset as resetForm, } from 'redux-form'; import { ModalUtils } from 'arachne-ui-components'; -import { get, getFormSelectedCheckboxes } from 'services/Utils'; +import { get } from 'services/Utils'; import actions from 'actions'; import { form, modal } from 'modules/AnalysisExecution/const'; import presenter from './presenter'; import selectors from './selectors'; class ImportList extends Component { - constructor() { - super(); - this.state = { - filterText: '', - }; - this.filter = this.filter.bind(this); - } - - filter(filterText) { - this.setState({ - filterText, - }); - } - - render() { - return presenter({ - ...this.props, - ...this.state, - filter: this.filter, - }); - } + constructor() { + super(); + this.state = { + filterText: '', + }; + this.filter = this.filter.bind(this); + } + + filter(filterText) { + this.setState({ + filterText, + }); + } + + render() { + return presenter({ + ...this.props, + ...this.state, + filter: this.filter, + }); + } } ImportList.propTypes = { - selectedSource: PropTypes.shape({ - id: PropTypes.number, - }), - analysisType: PropTypes.string, + selectedSource: PropTypes.shape({ + id: PropTypes.number, + }), + analysisType: PropTypes.string, }; function mapStateToProps(state, ownProps) { - const analysisType = get(state, 'analysisExecution.analysis.data.result.type.id', '', 'String'); - const selectedSource = get(ownProps, 'selectedSource', {}, 'Object'); - const selectedEntity = selectors.getFormEntity(state); - - return { - selectedSource, - isAnySelected: selectedEntity, - entities: selectors.getList(state), - totalSteps: ownProps.totalSteps, - step: ownProps.step, - goBack: ownProps.goBack, - analysisId: get(state, 'analysisExecution.analysis.data.result.id', 'Number'), - analysisType, - }; + const analysisType = get(state, 'analysisExecution.analysis.data.result.type.id', '', 'String'); + const selectedSource = get(ownProps, 'selectedSource', {}, 'Object'); + const selectedEntity = selectors.getFormEntity(state); + + return { + selectedSource, + isAnySelected: selectedEntity, + entities: selectors.getList(state), + totalSteps: ownProps.totalSteps, + step: ownProps.step, + goBack: ownProps.goBack, + analysisId: get(state, 'analysisExecution.analysis.data.result.id', 'Number'), + analysisType, + }; } const mapDispatchToProps = { - importEntities: actions.analysisExecution.importEntity.create, - closeModal: () => ModalUtils.actions.toggle(modal.createCode, false), - loadAnalysis: actions.analysisExecution.analysis.find, - reset: () => resetForm(form.importCodeList), - showModalError: params => ModalUtils.actions.toggle(modal.modalError, true, params), + importEntities: actions.analysisExecution.importEntity.create, + closeModal: () => ModalUtils.actions.toggle(modal.createCode, false), + loadAnalysis: actions.analysisExecution.analysis.find, + openUpdateDescriptionModal: newDescription => ModalUtils.actions.toggle(modal.updateAnalysisDescription, true, {newDescription}), + reset: () => resetForm(form.importCodeList), + showModalError: params => ModalUtils.actions.toggle(modal.modalError, true, params), }; function mergeProps(stateProps, dispatchProps, ownProps) { - return { - ...ownProps, - ...stateProps, - ...dispatchProps, - doSubmit({ entity }) { - // TEMP. TODO! - const datanodeId = stateProps.selectedSource.id; - const entityGuid = entity; - - const submitPromise = dispatchProps.importEntities( - { - analysisId: stateProps.analysisId, - type: stateProps.analysisType, - }, - { - dataNodeId: datanodeId, - entityGuid, - } - ); - - submitPromise.then(() => dispatchProps.reset()) - .then(() => dispatchProps.closeModal()) - .then(() => dispatchProps.loadAnalysis({ id: stateProps.analysisId })) - .catch((error) => { - const errors = get(error, `errors.${entityGuid}`); - if (errors) { - dispatchProps.showModalError({ - title: 'Unsuccessful import', - errors, - }); - } - }); + return { + ...ownProps, + ...stateProps, + ...dispatchProps, + async doSubmit({entity}) { + // TEMP. TODO! + const datanodeId = stateProps.selectedSource.id; + const entityGuid = entity; + + async function handleImportAnalysis(importResponse) { + await dispatchProps.reset(); + await dispatchProps.closeModal(); + return importResponse.result; + } + + async function handleDescriptionUpdate(newDescription) { + if (!!newDescription) { + await dispatchProps.openUpdateDescriptionModal(newDescription); + } + } + + try { + const importResult = await dispatchProps.importEntities( + { + analysisId: stateProps.analysisId, + type: stateProps.analysisType, + }, + { + dataNodeId: datanodeId, + entityGuid, + } + ); - return submitPromise; - }, - }; + const newDescription = await handleImportAnalysis(importResult); + await handleDescriptionUpdate(newDescription); + await dispatchProps.loadAnalysis({id: stateProps.analysisId}); + + } catch (error) { + const errors = get(error, `errors.${entityGuid}`); + if (errors) { + await dispatchProps.showModalError({ + title: 'Unsuccessful import', + errors, + }); + } + + } + }, + }; } const ReduxImportList = reduxForm({ - form: form.importCodeList, + form: form.importCodeList, })(ImportList); export default connect( - mapStateToProps, - mapDispatchToProps, - mergeProps + mapStateToProps, + mapDispatchToProps, + mergeProps )(ReduxImportList); diff --git a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/ImportList/style.scss b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/ImportList/style.scss index e477888e2..7252fc370 100644 --- a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/ImportList/style.scss +++ b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/ImportList/style.scss @@ -25,15 +25,15 @@ .#{$namespace} { &code-import-list { - + &__descr { @include title(); display: block; - padding: 1.5rem 2rem; + padding: 1.5rem 2rem; } &__list { - height: 600px; + height: 40rem; width: 100%; outline: none; diff --git a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/ImportLoading/container.jsx b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/ImportLoading/container.jsx index 6b5b83505..8380904f8 100644 --- a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/ImportLoading/container.jsx +++ b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/ImportLoading/container.jsx @@ -38,6 +38,7 @@ function mapStateToProps(state, ownProps) { ), goBack: ownProps.goBack, analysisType, + analysesImportError: ownProps.analysesImportError, }; } diff --git a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/ImportLoading/presenter.jsx b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/ImportLoading/presenter.jsx index 67d898e5e..8dd863cb9 100644 --- a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/ImportLoading/presenter.jsx +++ b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/ImportLoading/presenter.jsx @@ -22,13 +22,13 @@ import React from 'react'; import BEMHelper from 'services/BemHelper'; -import { Button, LoadingPanel } from 'arachne-ui-components'; +import { Button, LoadingPanel, Panel } from 'arachne-ui-components'; import ProgressDots from 'components/ProgressDots'; import { nameAnalysisType } from 'modules/AnalysisExecution/const'; require('./style.scss'); -function CohortLoading({ selectedSource, totalSteps, step, goBack, analysisType }) { +function CohortLoading({ selectedSource, totalSteps, step, goBack, analysisType, analysesImportError }) { const classes = new BEMHelper('code-import-loader'); const BackBtn = ( @@ -39,21 +39,29 @@ function CohortLoading({ selectedSource, totalSteps, step, goBack, analysisType /> ); + const errorOccur = !!analysesImportError; return ( -
    -
    - +
    + {!errorOccur && + -
    -
    - + } + />} + {errorOccur && + +
    {analysesImportError}
    +
    + } +
    + +
    + +
    -
    ); } diff --git a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/ImportLoading/style.scss b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/ImportLoading/style.scss index 30e67ce29..1fcb644a9 100644 --- a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/ImportLoading/style.scss +++ b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/ImportLoading/style.scss @@ -44,6 +44,17 @@ } } } + + & .#{$namespace} { + &panel { + + &__content{ + color: red; + padding: 2rem; + } + } + } + } } diff --git a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/NotAvailable/presenter.jsx b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/NotAvailable/presenter.jsx index 05fd02782..b30e53016 100644 --- a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/NotAvailable/presenter.jsx +++ b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/NotAvailable/presenter.jsx @@ -30,7 +30,7 @@ function NotAvailable() { return (
    - Import is available for analysis with type Cohort or Population Level Estimation. + Import is available for analysis with type Cohort, Incidence Rates, Patient Level Prediction or Population Level Estimation.
    ); } diff --git a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/container.js b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/container.js index e2099a2e4..07b0ed035 100644 --- a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/container.js +++ b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/container.js @@ -46,17 +46,25 @@ class ImportCode extends Component { resetSource() { this.setState({ selectedSource: null, + analysesImportError: null, }); } + handleError = (error) => { + this.setState({ + analysesImportError: error.message, + }); + }; + selectSource(selectedSource) { this.setState({ selectedSource, }); + this.props.loadList({ dataNodeId: selectedSource.id, type: this.props.analysisType, - }); + }).catch(this.handleError); } render() { diff --git a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/presenter.jsx b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/presenter.jsx index cd6d64433..46b15d05a 100644 --- a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/presenter.jsx +++ b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalCreateCode/Import/presenter.jsx @@ -38,6 +38,7 @@ function ImportCode(props) { resetSource, selectSource, analysisType, + analysesImportError, } = props; let panels; @@ -56,6 +57,7 @@ function ImportCode(props) { element: , showIf: () => selectedSource && isImportRunning, }, diff --git a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalStatusHistory/presenter.jsx b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalStatusHistory/presenter.jsx index a096f39ff..537c4172f 100644 --- a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalStatusHistory/presenter.jsx +++ b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalStatusHistory/presenter.jsx @@ -45,14 +45,18 @@ function StatusListItem({ status }) { {...classes({ element: 'status', modifiers })} > {status.title} -
    +
    +
    +
    comment +
    +
    } diff --git a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalStatusHistory/style.scss b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalStatusHistory/style.scss index 9e3c77d35..c52021a09 100644 --- a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalStatusHistory/style.scss +++ b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalStatusHistory/style.scss @@ -53,6 +53,17 @@ text-transform: initial; } + &__tooltip-container { + position: absolute; + display: inline; + } + + &__tooltip-wrapper { + position: relative; + display: inline; + bottom: 1rem; + } + &__comment-ico { @include material-icon(); color: $black; diff --git a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalUpdateDescription/container.js b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalUpdateDescription/container.js new file mode 100644 index 000000000..7a1653bb3 --- /dev/null +++ b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalUpdateDescription/container.js @@ -0,0 +1,79 @@ +/* + * + * Copyright 2018 Odysseus Data Services, inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Company: Odysseus Data Services, Inc. + * Product Owner/Architecture: Gregory Klebanov + * Authors: Alexandr Cumarav + * Created: January 22, 2020 + * + */ + +import { connect } from 'react-redux'; +import { reduxForm } from 'redux-form'; +import { get } from 'services/Utils'; +import actions from 'actions/index'; +import { ModalUtils } from "arachne-ui-components"; +import { form, modal } from 'modules/AnalysisExecution/const'; +import ModalUpdateDescription from './presenter'; + +function mapStateToProps(state) { + + const modalState = state.modal.updateAnalysisDescription; + const newDescription = get(modalState, 'data.newDescription', ''); + const analysisData = get(state, 'analysisExecution.analysis.data.result'); + return { + analysisId: get(analysisData, 'id'), + typeId: get(analysisData, 'type.id'), + initialValues: { + description: get(analysisData, 'description'), + }, + newDescription, + }; +} + +const mapDispatchToProps = { + updateAnalysis: actions.analysisExecution.analysis.update, + loadAnalysis: actions.analysisExecution.analysis.find, + closeModal: () => ModalUtils.actions.toggle(modal.updateAnalysisDescription, false), +}; + +function mergeProps(stateProps, dispatchProps, ownProps) { + return Object.assign({ + ...ownProps, + ...stateProps, + ...dispatchProps, + async doSubmit() { + + await dispatchProps.updateAnalysis( + {id: stateProps.analysisId}, + {description: stateProps.newDescription, typeId: stateProps.typeId}, + false + ); + await dispatchProps.closeModal(); + dispatchProps.loadAnalysis({id: stateProps.analysisId}); + }, + }); +} + +let ReduxModalUpdateDescription = ModalUtils.connect({ + name: modal.updateAnalysisDescription, +})(ModalUpdateDescription); + +ReduxModalUpdateDescription = reduxForm({ + form: form.updateAnalysisDescription, + enableReinitialize: true, +})(ReduxModalUpdateDescription); + +export default connect(mapStateToProps, mapDispatchToProps, mergeProps)(ReduxModalUpdateDescription); diff --git a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalUpdateDescription/index.js b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalUpdateDescription/index.js new file mode 100644 index 000000000..9e7dac892 --- /dev/null +++ b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalUpdateDescription/index.js @@ -0,0 +1,25 @@ +/* + * + * Copyright 2018 Odysseus Data Services, inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Company: Odysseus Data Services, Inc. + * Product Owner/Architecture: Gregory Klebanov + * Authors: Alexandr Cumarav + * Created: January 22, 2020 + * + */ + +import ModalUpdateDescription from './container'; + +export default ModalUpdateDescription; \ No newline at end of file diff --git a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalUpdateDescription/presenter.jsx b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalUpdateDescription/presenter.jsx new file mode 100644 index 000000000..8547f8947 --- /dev/null +++ b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalUpdateDescription/presenter.jsx @@ -0,0 +1,67 @@ +/* + * + * Copyright 2018 Odysseus Data Services, inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Company: Odysseus Data Services, Inc. + * Product Owner/Architecture: Gregory Klebanov + * Authors: Alexandr Cumarav + * Created: January 22, 2020 + * + */ + +import React from 'react'; +import BEMHelper from 'services/BemHelper'; +import { Form, Modal } from 'arachne-ui-components'; + +require('./style.scss'); + +function ModalUpdateDescription(props) { + + const {newDescription} = props; + const classes = new BEMHelper('analysis-form-update-description'); + + const submitBtn = { + label: 'Replace', + loadingLabel: 'Replacing...', + mods: ['success', 'rounded'], + }; + + const cancelBtn = { + label: 'Leave existing', + }; + + return ( + +
    +
    +
    Would you like to replace the existing description with the:
    +
    {newDescription}
    +
    + + +
    +
    +
    + ); +} + +export default ModalUpdateDescription; \ No newline at end of file diff --git a/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalUpdateDescription/style.scss b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalUpdateDescription/style.scss new file mode 100644 index 000000000..0830702a1 --- /dev/null +++ b/src/modules/AnalysisExecution/components/ViewEditAnalysis/ModalUpdateDescription/style.scss @@ -0,0 +1,41 @@ +/* + * + * Copyright 2018 Odysseus Data Services, inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Company: Odysseus Data Services, Inc. + * Product Owner/Architecture: Gregory Klebanov + * Authors: Alexandr Cumarav + * Created: January 22, 2020 + * + */ + +@import 'styles/vars-and-mixins.scss'; + +.#{$namespace} { + + &analysis-form-update-description { + @include form(); + width: 60rem; + + &__question { + padding: 1rem; + } + + &__new-description { + font-weight: bold; + padding: 1rem; + } + } + +} \ No newline at end of file diff --git a/src/modules/AnalysisExecution/components/ViewEditAnalysis/Settings/container.js b/src/modules/AnalysisExecution/components/ViewEditAnalysis/Settings/container.js index ac35e12cc..9185c944b 100644 --- a/src/modules/AnalysisExecution/components/ViewEditAnalysis/Settings/container.js +++ b/src/modules/AnalysisExecution/components/ViewEditAnalysis/Settings/container.js @@ -58,7 +58,7 @@ function mergeProps(stateProps, dispatchProps, ownProps) { ...stateProps, ...dispatchProps, setType: (type) => { - dispatchProps + type && dispatchProps .update( { id: stateProps.analysisId }, { typeId: type } diff --git a/src/modules/AnalysisExecution/components/ViewEditAnalysis/presenter.jsx b/src/modules/AnalysisExecution/components/ViewEditAnalysis/presenter.jsx index c89befea4..e9aa0e60a 100644 --- a/src/modules/AnalysisExecution/components/ViewEditAnalysis/presenter.jsx +++ b/src/modules/AnalysisExecution/components/ViewEditAnalysis/presenter.jsx @@ -40,6 +40,7 @@ import ModalSubmitCode from './ModalSubmitCode/index'; import ModalFiles from './ModalFiles/index'; import ModalStatusHistory from './ModalStatusHistory'; import ModalUploadResult from './ModalUploadResult'; +import ModalUpdateDescription from './ModalUpdateDescription/index'; import ModalRejectSubmission from './ModalRejectSubmission'; import ModalAddDataSource from 'modules/StudyManager/components/ViewEdit/ModalAddDataSource'; import ModalError from './ModalCreateCode/components/ModalError'; @@ -71,6 +72,7 @@ export default class ViewEditAnalysis extends Component { , , , + , , , , diff --git a/src/modules/AnalysisExecution/components/ViewEditInsight/Description/View/style.scss b/src/modules/AnalysisExecution/components/ViewEditInsight/Description/View/style.scss index 932d913b7..fab354dde 100644 --- a/src/modules/AnalysisExecution/components/ViewEditInsight/Description/View/style.scss +++ b/src/modules/AnalysisExecution/components/ViewEditInsight/Description/View/style.scss @@ -23,11 +23,12 @@ @import 'styles/vars-and-mixins.scss'; .#{$namespace} { - + &insight-description-view { display: block; padding: 15px 20px; line-height: 2.1rem; + word-break: break-all; &--empty { color: $grey-placeholder; diff --git a/src/modules/AnalysisExecution/const.js b/src/modules/AnalysisExecution/const.js index 4bef5019a..ec9949327 100644 --- a/src/modules/AnalysisExecution/const.js +++ b/src/modules/AnalysisExecution/const.js @@ -36,6 +36,7 @@ const modal = keyMirror({ statusHistory: null, submitCode: null, uploadResult: null, + updateAnalysisDescription: null, rejectSubmission: null, submissionsTableFilter: null, modalError: null, @@ -55,6 +56,7 @@ const form = keyMirror({ requestUnlock: null, submitCode: null, uploadResult: null, + updateAnalysisDescription: null, importNodeSelector: null, importCodeList: null, rejectSubmission: null, @@ -84,6 +86,7 @@ function importEntityPathByType(type) { case 'ESTIMATION': return 'estimations'; case 'PREDICTION': return 'predictions'; case 'INCIDENCE': return 'incidence-rates'; + case 'COHORT_PATHWAY': return 'cohort-pathways'; default: return ''; } } @@ -198,7 +201,7 @@ const submissionActionTypes = keyMirror({ HIDE: null, }); -const importableAnalysisTypes = ['COHORT', 'ESTIMATION', 'PREDICTION', 'COHORT_HERACLES', 'COHORT_CHARACTERIZATION', 'INCIDENCE']; +const importableAnalysisTypes = ['COHORT', 'ESTIMATION', 'PREDICTION', 'COHORT_HERACLES', 'COHORT_CHARACTERIZATION', 'INCIDENCE', 'COHORT_PATHWAY']; const analysisTypeNames = { COHORT: 'cohort', ESTIMATION: 'PLE analysis', @@ -207,6 +210,7 @@ const analysisTypeNames = { COHORT_CHARACTERIZATION: 'cohort characterization', INCIDENCE: 'incidence rates', CUSTOM: 'custom', + COHORT_PATHWAY: 'cohort pathway', }; const pluralAnalysisTypeNames = { COHORT: 'cohorts', @@ -216,6 +220,7 @@ const pluralAnalysisTypeNames = { COHORT_CHARACTERIZATION: 'cohort characterizations', INCIDENCE: 'incidence rates', CUSTOM: 'custom', + COHORT_PATHWAY: 'cohort pathways', }; function nameAnalysisType({ analysisType, capitalize = false, plural = false }) { const typeNames = plural ? pluralAnalysisTypeNames : analysisTypeNames; @@ -255,6 +260,7 @@ const analysisTypes = keyMirror({ COHORT_CHARACTERIZATION: null, ESTIMATION: null, PREDICTION: null, + COHORT_PATHWAY: null, }); const submissionGroupsPageSize = 5; @@ -282,7 +288,7 @@ const submissionStatuses = [ }, { value: 'EXECUTED', - label: 'Avaiting approval (success)', + label: 'Awaiting approval (success)', }, { value: 'FAILED', diff --git a/src/modules/AnalysisExecution/ducks/index.js b/src/modules/AnalysisExecution/ducks/index.js index 41b239312..bc280889e 100644 --- a/src/modules/AnalysisExecution/ducks/index.js +++ b/src/modules/AnalysisExecution/ducks/index.js @@ -45,6 +45,8 @@ import fileTreeData from './fileTreeData'; import submissionSummary from './submissionSummary'; import submissionGroups from './submissionGroups'; +import pathwaySummary from './pathwaySummary'; + export default { actions: { analysis: analysis.actions, @@ -70,6 +72,7 @@ export default { fileTreeData: fileTreeData.actions, submissionSummary: submissionSummary.actions, submissionGroups: submissionGroups.actions, + pathwaySummary: pathwaySummary.actions, }, reducer: { analysis: analysis.reducer, @@ -89,5 +92,6 @@ export default { fileTreeData: fileTreeData.reducer, submissionSummary: submissionSummary.reducer, submissionGroups: submissionGroups.reducer, + pathwaySummary: pathwaySummary.reducer, }, }; diff --git a/src/modules/AnalysisExecution/ducks/pathwaySummary.js b/src/modules/AnalysisExecution/ducks/pathwaySummary.js new file mode 100644 index 000000000..8de4a1f0b --- /dev/null +++ b/src/modules/AnalysisExecution/ducks/pathwaySummary.js @@ -0,0 +1,102 @@ +/* + * + * Copyright 2018 Odysseus Data Services, inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Company: Odysseus Data Services, Inc. + * Product Owner/Architecture: Gregory Klebanov + * Authors: Vitaly Koulakov + * Created: May 24, 2019 + * + */ + +import Duck from 'services/Duck'; +import { get } from 'services/Utils'; +import cloneDeep from 'lodash/cloneDeep'; +import { apiPaths, fileTypes } from 'modules/AnalysisExecution/const'; +import ReducerFactory from 'services/ReducerFactory'; +import { action as actionName } from 'services/CrudActionNameBuilder'; + +const coreName = 'AE_PATHWAY_SUMMARY'; + +class PathwaySummaryDuckBuilder { + constructor() { + this.reducerFactory = new ReducerFactory(); + + this.actions = { + GET_DETAILS: `${coreName}_GET_DETAILS`, + }; + + this.duck = new Duck({ + name: coreName, + urlBuilder: () => null, + }); + } + + getGetDetailsAction() { + return ({ pathway, node }) => { + const path = pathway.getPathToNode(node); + + const rowBuilder = (path, i ,allPaths) => ({ + names: path.names, + personCount: path.count, + remainPct: path.count / pathway.summary.totalPathways + }); + + let rows = path.map(rowBuilder); + rows.forEach((r, i) => { + if (i > 0) { + r.diffPct = rows[i-1].remainPct - r.remainPct; + } else { + r.diffPct = 1.0 - r.remainPct; + } + }); + + return ({ + type: this.actions.GET_DETAILS, + payload: { + details: rows, + } + }) + }; + } + + buildReducer() { + return this.reducerFactory + .setActionHandlers([ + { + action: this.actions.GET_DETAILS, + handler: (state, { payload: { details } }) => { + return ({ + ...state, + details, + }); + } + } + ]) + .build(); + } + + build() { + return { + actions: { + getDetails: this.getGetDetailsAction(), + }, + reducer: this.buildReducer(), + } + } +} + +const builder = new PathwaySummaryDuckBuilder(); + +export default builder.build(); \ No newline at end of file diff --git a/src/modules/Auth/components/Login/FormLogin/container.js b/src/modules/Auth/components/Login/FormLogin/container.js index fa2bafc8c..4a8619b75 100644 --- a/src/modules/Auth/components/Login/FormLogin/container.js +++ b/src/modules/Auth/components/Login/FormLogin/container.js @@ -31,7 +31,7 @@ import FormLogin from './presenter'; import Auth from 'services/Auth'; function mapStateToProps(state) { - const authMethod = get(state, 'auth.authMethod.data.result.userOrigin', authMethods.NATIVE); + const authMethod = get(state, 'auth.authMethod.data.result.userOrigin', authMethods.JDBC); const isUnactivated = get(state, 'form.login.submitErrors.unactivated', false); const userEmail = get(state, 'form.login.values.username', ''); const isStandalone = get(state, 'auth.nodeMode.data.mode') === nodeFunctionalModes.Standalone; diff --git a/src/modules/Auth/components/Logout/container.jsx b/src/modules/Auth/components/Logout/container.jsx index 53ee9c6ae..de48276ac 100644 --- a/src/modules/Auth/components/Logout/container.jsx +++ b/src/modules/Auth/components/Logout/container.jsx @@ -24,13 +24,21 @@ import React from 'react'; import { connect } from 'react-redux'; import authDucks from 'modules/Auth/ducks'; import Logout from './presenter'; +import { get } from 'services/Utils'; -function mapStateToProps() { - return {}; +function mapStateToProps(state) { + return { + authMode: get(state, 'auth.authMode.data.result.mode') + } } const mapDispatchToProps = { + iapLogout: () => { + window.location = '/_gcp_iap/clear_login_cookie'; + }, logout: () => authDucks.actions.logout(), + }; + export default connect(mapStateToProps, mapDispatchToProps)(Logout); diff --git a/src/modules/Auth/components/Logout/presenter.jsx b/src/modules/Auth/components/Logout/presenter.jsx index 2b6d4e0a1..5eae6206d 100644 --- a/src/modules/Auth/components/Logout/presenter.jsx +++ b/src/modules/Auth/components/Logout/presenter.jsx @@ -23,11 +23,20 @@ import React from 'react'; import BEMHelper from 'services/BemHelper'; import { Link } from 'arachne-ui-components'; +import { authenticationModes } from 'modules/Auth/const'; require('./style.scss'); -function Logout({ logout }) { +function Logout({ logout, iapLogout, authMode }) { const classes = new BEMHelper('user-menu'); + if (authMode === authenticationModes.Proxy) { + return ( +
    + power_settings_new + +
    + ); + } return (
    diff --git a/src/modules/Auth/components/Logout/style.scss b/src/modules/Auth/components/Logout/style.scss index c173f5f58..a563038f0 100644 --- a/src/modules/Auth/components/Logout/style.scss +++ b/src/modules/Auth/components/Logout/style.scss @@ -35,6 +35,14 @@ font-size: 2.4rem; } } + &__iap { + &--iframe { + position: absolute; + width: 0; + height: 0; + border: none; + } + } } } \ No newline at end of file diff --git a/src/modules/Auth/const.js b/src/modules/Auth/const.js index c7a75fd04..8dd586f21 100644 --- a/src/modules/Auth/const.js +++ b/src/modules/Auth/const.js @@ -68,6 +68,7 @@ const apiPaths = { // principal: () => '/api/v1/auth/me', authMethod: () => '/api/v1/auth/method', + authMode: () => '/api/v1/auth/mode', refresh: () => '/api/v1/auth/refresh', // passwordPolicy: () => '/api/v1/auth/password-policies', @@ -81,7 +82,7 @@ const apiPaths = { const authMethods = keyMirror({ LDAP: null, - NATIVE: null, + JDBC: null, }); const registerFields = function ({ professionalTypesOptions, @@ -301,6 +302,11 @@ const nodeFunctionalModes = { Network: 'NETWORK', } +const authenticationModes = { + Standard: 'STANDARD', + Proxy: 'PROXY', +} + export { actionTypes, authMethods, @@ -311,4 +317,5 @@ export { paths, registerFields, nodeFunctionalModes, + authenticationModes, }; diff --git a/src/modules/Auth/ducks/authMode.js b/src/modules/Auth/ducks/authMode.js new file mode 100644 index 000000000..aef62d852 --- /dev/null +++ b/src/modules/Auth/ducks/authMode.js @@ -0,0 +1,42 @@ +/* + * + * Copyright 2018 Odysseus Data Services, inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Company: Odysseus Data Services, Inc. + * Product Owner/Architecture: Gregory Klebanov + * Authors: Pavel Grafkin, Alexander Saltykov, Vitaly Koulakov, Anton Gackovka, Alexandr Ryabokon, Mikhail Mironov + * Created: October 12, 2017 + * + */ + +import Duck from 'services/Duck'; +import { apiPaths } from 'modules/Auth/const'; + +const actionCoreName = 'AU_AUTH_MODE'; + +const authModeDuck = new Duck( + { + name: actionCoreName, + urlBuilder: apiPaths.authMode, + },// +); + +const actions = authModeDuck.actions; +const reducer = authModeDuck.reducer; + + +export default { + actions, + reducer, +}; \ No newline at end of file diff --git a/src/modules/Auth/ducks/index.js b/src/modules/Auth/ducks/index.js index 99f1b3fd7..8205dda0e 100644 --- a/src/modules/Auth/ducks/index.js +++ b/src/modules/Auth/ducks/index.js @@ -37,6 +37,7 @@ import passwordPolicy from './passwordPolicy'; import countries from './countries'; import provinces from './provinces'; import nodeMode from './nodeMode'; +import authMode from './authMode'; function setBackUrl(state, action) { return !isAuthModulePath(action.payload.pathname) ? { ...state, backUrl: action.payload.pathname } : state; @@ -52,6 +53,7 @@ const actions = { clearToken: authLogout.actions.clearToken, principal: principal.actions, authMethod: authMethod.actions, + authMode: authMode.actions, register: authRegister.actions.create, professionalType: professionalType.actions, remindPassword: remindPassword.actions, @@ -69,6 +71,7 @@ const reducer = combineReducers({ authLogout: authLogout.reducer, principal: principal.reducer, authMethod: authMethod.reducer, + authMode: authMode.reducer, authRegister: authRegister.reducer, professionalType: professionalType.reducer, remindPassword: remindPassword.reducer, diff --git a/src/modules/Portal/components/Settings/FormPassword/container.js b/src/modules/Portal/components/Settings/FormPassword/container.js index ca7f42f47..2d17bb772 100644 --- a/src/modules/Portal/components/Settings/FormPassword/container.js +++ b/src/modules/Portal/components/Settings/FormPassword/container.js @@ -51,8 +51,12 @@ function mergeProps(stateProps, dispatchProps, ownProps) { }); submitPromise - .then(dispatchProps.resetForm) - .catch(() => {}); + .then(() => { + dispatchProps.resetForm(); + alert('Password has been updated successfully.'); + }) + .catch(() => { + }); return submitPromise; }, diff --git a/src/modules/Portal/components/Settings/FormPassword/presenter.jsx b/src/modules/Portal/components/Settings/FormPassword/presenter.jsx index 4cd6100b2..306f49659 100644 --- a/src/modules/Portal/components/Settings/FormPassword/presenter.jsx +++ b/src/modules/Portal/components/Settings/FormPassword/presenter.jsx @@ -68,7 +68,7 @@ function FormPassword(props) { mods: ['bordered'], placeholder: 'New password confirmation', showHint: false, - } + }, }, }, ]; diff --git a/src/modules/StudyManager/components/ViewEdit/Actions/container.js b/src/modules/StudyManager/components/ViewEdit/Actions/container.js index 57943ea9e..c0857283f 100644 --- a/src/modules/StudyManager/components/ViewEdit/Actions/container.js +++ b/src/modules/StudyManager/components/ViewEdit/Actions/container.js @@ -111,7 +111,7 @@ export default class StudyActionsBuilder { message: `Are you sure you want to delete study '${stateProps.title}'?`, }) .then(() => { - dispatchProps.remove(stateProps.studyId) + dispatchProps.remove({id: stateProps.studyId}) .then(() => dispatchProps.goBack()) .catch(() => {}); }); diff --git a/src/modules/StudyManager/components/ViewEdit/ListParticipants/presenter.jsx b/src/modules/StudyManager/components/ViewEdit/ListParticipants/presenter.jsx index 43d6487b8..646e93812 100644 --- a/src/modules/StudyManager/components/ViewEdit/ListParticipants/presenter.jsx +++ b/src/modules/StudyManager/components/ViewEdit/ListParticipants/presenter.jsx @@ -15,7 +15,7 @@ * * Company: Odysseus Data Services, Inc. * Product Owner/Architecture: Gregory Klebanov - * Authors: Pavel Grafkin, Alexander Saltykov, Vitaly Koulakov, Anton Gackovka, Alexandr Ryabokon, Mikhail Mironov + * Authors: Pavel Grafkin, Alexander Saltykov, Vitaly Koulakov, Anton Gackovka, Alexandr Ryabokon, Mikhail Mironov, Alexandr Cumarav * Created: December 27, 2016 * */ @@ -25,9 +25,29 @@ import DraggableList from 'react-draggable-list'; import { ListItem, Link, Select } from 'arachne-ui-components'; import BEMHelper from 'services/BemHelper'; import { newParticipantRolesOptions, participantRoles } from 'modules/StudyManager/const'; +import { Avatar } from 'arachne-ui-components'; +import { apiPaths } from 'modules/StudyManager/const'; require('./style.scss'); +function ParticipantCard({url, participant}) { + const classes = new BEMHelper('participant-card-avatar'); + + return ( +
    +
    + + {participant.fullName} +
    +
    + ); +} + +ParticipantCard.propTypes = { + url: PropTypes.string.isRequired, + participant: PropTypes.object.isRequired, +}; + function ParticipantItem(props) { const classes = new BEMHelper('study-participants-item'); const tootlopClasses = new BEMHelper('tooltip'); @@ -77,7 +97,6 @@ function ParticipantItem(props) { ); } - return ( -
    - {participant.fullName} - {participant.comment && - -
    chat_bubble
    - - } -
    +
    -
    +
    {participant.canBeRemoved ?