diff --git a/package-lock.json b/package-lock.json index c9e6441f6d8f03b9183ef56ba679682495730798..182e25badcc362ce1ac627ea0393a2a2529d474a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2842,9 +2842,9 @@ } }, "@emotion/hash": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.7.3.tgz", - "integrity": "sha512-14ZVlsB9akwvydAdaEnVnvqu6J2P6ySv39hYyl/aoB6w/V+bXX0tay8cF6paqbgZsN2n5Xh15uF4pE+GvE+itw==" + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.7.4.tgz", + "integrity": "sha512-fxfMSBMX3tlIbKUdtGKxqB1fyrH6gVrX39Gsv3y8lRYKUqlgDt3UMqQyGnR1bQMa2B8aGnhLZokZgg8vT0Le+A==" }, "@jest/console": { "version": "24.9.0", @@ -3815,70 +3815,56 @@ "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==" }, "@material-ui/core": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.5.1.tgz", - "integrity": "sha512-6pyk7diT7bflf4qUpqgPCpKYqjhRHPFwsgEV2Gv71lMqwxuRygFGHE2TdZ+l5T249H66Doj2P/j6fW7yzgxTWw==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.8.3.tgz", + "integrity": "sha512-ZJbfJQmkuZCSQTf0nzpfZwizmDdCq8ruZxnPNFnhoKDqgJpMvV8TJRi8vdI9ls1tMuTqxlhyhw8556fxOpWpFQ==", "requires": { "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.5.0", - "@material-ui/system": "^4.5.0", + "@material-ui/styles": "^4.8.2", + "@material-ui/system": "^4.7.1", "@material-ui/types": "^4.1.1", - "@material-ui/utils": "^4.4.0", + "@material-ui/utils": "^4.7.1", "@types/react-transition-group": "^4.2.0", "clsx": "^1.0.2", "convert-css-length": "^2.0.1", - "deepmerge": "^4.0.0", "hoist-non-react-statics": "^3.2.1", - "is-plain-object": "^3.0.0", "normalize-scroll-left": "^0.2.0", "popper.js": "^1.14.1", "prop-types": "^15.7.2", + "react-is": "^16.8.0", "react-transition-group": "^4.3.0" }, "dependencies": { "@babel/runtime": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", - "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", + "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", "requires": { "regenerator-runtime": "^0.13.2" } }, "csstype": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.7.tgz", - "integrity": "sha512-9Mcn9sFbGBAdmimWb2gLVDtFJzeKtDGIr76TUqmjZrw9LFXBMSU70lcs+C0/7fyCd6iBDqmksUcCOUIkisPHsQ==" + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.8.tgz", + "integrity": "sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA==" }, "dom-helpers": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.1.2.tgz", - "integrity": "sha512-VrfjMjIzNgn2oB49wKl85fgs12ELjK0npu5Oryaiazyc6WuekO1go0E//0RJ8JvsBlfaAwq+IgX9M0XhwlEENA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.1.3.tgz", + "integrity": "sha512-nZD1OtwfWGRBWlpANxacBEZrEuLa16o1nh7YopFWeoF68Zt8GGEmzHu6Xv4F3XaFIC+YXtTLrzgqKxFgLEe4jw==", "requires": { "@babel/runtime": "^7.6.3", "csstype": "^2.6.7" } }, "hoist-non-react-statics": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", - "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-wbg3bpgA/ZqWrZuMOeJi8+SKMhr7X9TesL/rXMjTzh0p0JUBo3II8DHboYbuIXWRlttrUFxwcu/5kygrCw8fJw==", "requires": { "react-is": "^16.7.0" } }, - "is-plain-object": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", - "integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==", - "requires": { - "isobject": "^4.0.0" - } - }, - "isobject": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", - "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==" - }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -3898,9 +3884,9 @@ } }, "react-is": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.10.2.tgz", - "integrity": "sha512-INBT1QEgtcCCgvccr5/86CfD71fw9EPmDxgiJX4I2Ddr6ZsV6iFXsuby+qWJPtmNuMY0zByTsG4468P7nHuNWA==" + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", + "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" }, "react-transition-group": { "version": "4.3.0", @@ -3956,17 +3942,16 @@ } }, "@material-ui/styles": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.5.0.tgz", - "integrity": "sha512-O0NSAECHK9f3DZK6wy56PZzp8b/7KSdfpJs8DSC7vnXUAoMPCTtchBKLzMtUsNlijiJFeJjSxNdQfjWXgyur5A==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.8.2.tgz", + "integrity": "sha512-r5U+93pkpwQOmHTmwyn2sqTio6PHd873xvSHiKP6fdybAXXX6CZgVvh3W8saZNbYr/QXsS8OHmFv7sYJLt5Yfg==", "requires": { "@babel/runtime": "^7.4.4", - "@emotion/hash": "^0.7.1", + "@emotion/hash": "^0.7.4", "@material-ui/types": "^4.1.1", - "@material-ui/utils": "^4.1.0", + "@material-ui/utils": "^4.7.1", "clsx": "^1.0.2", "csstype": "^2.5.2", - "deepmerge": "^4.0.0", "hoist-non-react-statics": "^3.2.1", "jss": "^10.0.0", "jss-plugin-camel-case": "^10.0.0", @@ -3980,17 +3965,17 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", - "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", + "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", "requires": { "regenerator-runtime": "^0.13.2" } }, "hoist-non-react-statics": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", - "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-wbg3bpgA/ZqWrZuMOeJi8+SKMhr7X9TesL/rXMjTzh0p0JUBo3II8DHboYbuIXWRlttrUFxwcu/5kygrCw8fJw==", "requires": { "react-is": "^16.7.0" } @@ -4014,9 +3999,9 @@ } }, "react-is": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.10.2.tgz", - "integrity": "sha512-INBT1QEgtcCCgvccr5/86CfD71fw9EPmDxgiJX4I2Ddr6ZsV6iFXsuby+qWJPtmNuMY0zByTsG4468P7nHuNWA==" + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", + "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" }, "regenerator-runtime": { "version": "0.13.3", @@ -4026,19 +4011,19 @@ } }, "@material-ui/system": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.5.1.tgz", - "integrity": "sha512-M72CGz3MYxXTFLet2qWmQDBXZdtF7JKGqYaf7t9MPDYD6WYG6wKM2hUbgUtRKOwls8ZBXQGKsiAX8K4v5pXSPw==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.7.1.tgz", + "integrity": "sha512-zH02p+FOimXLSKOW/OT2laYkl9bB3dD1AvnZqsHYoseUaq0aVrpbl2BGjQi+vJ5lg8w73uYlt9zOWzb3+1UdMQ==", "requires": { "@babel/runtime": "^7.4.4", - "deepmerge": "^4.0.0", + "@material-ui/utils": "^4.7.1", "prop-types": "^15.7.2" }, "dependencies": { "@babel/runtime": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", - "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", + "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", "requires": { "regenerator-runtime": "^0.13.2" } @@ -4062,9 +4047,9 @@ } }, "react-is": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.10.2.tgz", - "integrity": "sha512-INBT1QEgtcCCgvccr5/86CfD71fw9EPmDxgiJX4I2Ddr6ZsV6iFXsuby+qWJPtmNuMY0zByTsG4468P7nHuNWA==" + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", + "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" }, "regenerator-runtime": { "version": "0.13.3", @@ -4082,19 +4067,19 @@ } }, "@material-ui/utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.4.0.tgz", - "integrity": "sha512-UXoQVwArQEQWXxf2FPs0iJGT+MePQpKr0Qh0CPoLc1OdF0GSMTmQczcqCzwZkeHxHAOq/NkIKM1Pb/ih1Avicg==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.7.1.tgz", + "integrity": "sha512-+ux0SlLdlehvzCk2zdQ3KiS3/ylWvuo/JwAGhvb8dFVvwR21K28z0PU9OQW2PGogrMEdvX3miEI5tGxTwwWiwQ==", "requires": { "@babel/runtime": "^7.4.4", "prop-types": "^15.7.2", - "react-is": "^16.8.6" + "react-is": "^16.8.0" }, "dependencies": { "@babel/runtime": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", - "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", + "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", "requires": { "regenerator-runtime": "^0.13.2" } @@ -4118,9 +4103,9 @@ } }, "react-is": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.10.2.tgz", - "integrity": "sha512-INBT1QEgtcCCgvccr5/86CfD71fw9EPmDxgiJX4I2Ddr6ZsV6iFXsuby+qWJPtmNuMY0zByTsG4468P7nHuNWA==" + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", + "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" }, "regenerator-runtime": { "version": "0.13.3", @@ -6508,9 +6493,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", - "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", + "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", "requires": { "regenerator-runtime": "^0.13.2" } @@ -6776,11 +6761,6 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, - "deepmerge": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.1.1.tgz", - "integrity": "sha512-+qO5WbNBKBaZez95TffdUDnGIo4+r5kmsX8aOb7PDHvXsTbghAmleuxjs6ytNaf5Eg4FGBXDS5vqO61TRi6BMg==" - }, "default-gateway": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz", @@ -12057,9 +12037,9 @@ } }, "jss": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/jss/-/jss-10.0.0.tgz", - "integrity": "sha512-TPpDFsiBjuERiL+dFDq8QCdiF9oDasPcNqCKLGCo/qED3fNYOQ8PX2lZhknyTiAt3tZrfOFbb0lbQ9lTjPZxsQ==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.0.3.tgz", + "integrity": "sha512-AcDvFdOk16If9qvC9KN3oFXsrkHWM9+TaPMpVB9orm3z+nq1Xw3ofHyflRe/mkSucRZnaQtlhZs1hdP3DR9uRw==", "requires": { "@babel/runtime": "^7.3.1", "csstype": "^2.6.5", @@ -12068,76 +12048,76 @@ }, "dependencies": { "csstype": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.7.tgz", - "integrity": "sha512-9Mcn9sFbGBAdmimWb2gLVDtFJzeKtDGIr76TUqmjZrw9LFXBMSU70lcs+C0/7fyCd6iBDqmksUcCOUIkisPHsQ==" + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.8.tgz", + "integrity": "sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA==" } } }, "jss-plugin-camel-case": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.0.0.tgz", - "integrity": "sha512-yALDL00+pPR4FJh+k07A8FeDvfoPPuXU48HLy63enAubcVd3DnS+2rgqPXglHDGixIDVkCSXecl/l5GAMjzIbA==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.0.3.tgz", + "integrity": "sha512-rild/oFKFkmRP7AoiX9D6bdDAUfmJv8c7sEBvFoi+JP31dn2W8nw4txMKGnV1LJKlFkYprdZt1X99Uvztl1hug==", "requires": { "@babel/runtime": "^7.3.1", "hyphenate-style-name": "^1.0.3", - "jss": "10.0.0" + "jss": "^10.0.3" } }, "jss-plugin-default-unit": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.0.0.tgz", - "integrity": "sha512-sURozIOdCtGg9ap18erQ+ijndAfEGtTaetxfU3H4qwC18Bi+fdvjlY/ahKbuu0ASs7R/+WKCP7UaRZOjUDMcdQ==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.0.3.tgz", + "integrity": "sha512-n+XfVLPF9Qh7IOTdQ8M4oRpjpg6egjr/r0NNytubbCafMgCILJYIVrMTGgOTydH+uvak8onQY3f/F9hasPUx6g==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.0.0" + "jss": "^10.0.3" } }, "jss-plugin-global": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.0.0.tgz", - "integrity": "sha512-80ofWKSQUo62bxLtRoTNe0kFPtHgUbAJeOeR36WEGgWIBEsXLyXOnD5KNnjPqG4heuEkz9eSLccjYST50JnI7Q==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.0.3.tgz", + "integrity": "sha512-kNotkAciJIXpIGYnmueaIifBne9rdq31O8Xq1nF7KMfKlskNRANTcEX5rVnsGKl2yubTMYfjKBFCeDgcQn6+gA==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.0.0" + "jss": "^10.0.3" } }, "jss-plugin-nested": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.0.0.tgz", - "integrity": "sha512-waxxwl/po1hN3azTyixKnr8ReEqUv5WK7WsO+5AWB0bFndML5Yqnt8ARZ90HEg8/P6WlqE/AB2413TkCRZE8bA==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.0.3.tgz", + "integrity": "sha512-OMucRs9YLvWlZ3Ew+VhdgNVMwSS2zZy/2vy+s/etvopnPUzDHgCnJwdY2Wx/SlhLGERJeKKufyih2seH+ui0iw==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.0.0", + "jss": "^10.0.3", "tiny-warning": "^1.0.2" } }, "jss-plugin-props-sort": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.0.0.tgz", - "integrity": "sha512-41mf22CImjwNdtOG3r+cdC8+RhwNm616sjHx5YlqTwtSJLyLFinbQC/a4PIFk8xqf1qpFH1kEAIw+yx9HaqZ3g==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.0.3.tgz", + "integrity": "sha512-ufhvdCMnRcDa0tNHoZ12OcVNQQyE10yLMohxo/UIMarLV245rM6n9D19A12epjldRgyiS13SoSyLFCJEobprYg==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.0.0" + "jss": "^10.0.3" } }, "jss-plugin-rule-value-function": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.0.0.tgz", - "integrity": "sha512-Jw+BZ8JIw1f12V0SERqGlBT1JEPWax3vuZpMym54NAXpPb7R1LYHiCTIlaJUyqvIfEy3kiHMtgI+r2whGgRIxQ==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.0.3.tgz", + "integrity": "sha512-RWwIT2UBAIwf3f6DQtt5gyjxHMRJoeO9TQku+ueR8dBMakqSSe8vFwQNfjXEoe0W+Tez5HZCTkZKNMulv3Z+9A==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.0.0" + "jss": "^10.0.3" } }, "jss-plugin-vendor-prefixer": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.0.0.tgz", - "integrity": "sha512-qslqvL0MUbWuzXJWdUxpj6mdNUX8jr4FFTo3aZnAT65nmzWL7g8oTr9ZxmTXXgdp7ANhS1QWE7036/Q2isFBpw==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.0.3.tgz", + "integrity": "sha512-zVs6e5z4tFRK/fJ5kuTLzXlTFQbLeFTVwk7lTZiYNufmZwKT0kSmnOJDUukcSe7JLGSRztjWhnHB/6voP174gw==", "requires": { "@babel/runtime": "^7.3.1", - "css-vendor": "^2.0.6", - "jss": "10.0.0" + "css-vendor": "^2.0.7", + "jss": "^10.0.3" } }, "jsx-ast-utils": { diff --git a/package.json b/package.json index dbb73d29677ed4cf5f31ea39f058afb23e37aef9..6884041396d6c231f32b934f6f44dba9b0af2526 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ }, "dependencies": { "@babel/runtime": "^7.4.2", - "@material-ui/core": "^4.5.1", + "@material-ui/core": "^4.8.3", "@material-ui/icons": "^4.5.1", "Leaflet.Control.Opacity": "git+https://github.com/SemanticComputing/Leaflet.Control.Opacity.git", "Leaflet.extra-markers": "git+https://github.com/SemanticComputing/Leaflet.ExtraMarkers.git", diff --git a/src/client/components/facet_results/ResultTableHead.js b/src/client/components/facet_results/ResultTableHead.js index 6ee857f58fa7661f4bc16d13073439d6ec758a4b..feac494cf7cb1f9de0b289888200d0b3e6415c2e 100644 --- a/src/client/components/facet_results/ResultTableHead.js +++ b/src/client/components/facet_results/ResultTableHead.js @@ -30,33 +30,51 @@ const ResultTableHead = props => { const label = intl.get(`perspectives.${props.resultClass}.properties.${column.id}.label`) const description = intl.get(`perspectives.${props.resultClass}.properties.${column.id}.description`) return ( - <TableCell - className={classes.headerCol} - key={column.id} - sortDirection={sortBy === column.id ? sortDirection : false} - > - <Tooltip - title={`Sort by ${label}`} - enterDelay={300} - > - <TableSortLabel - active={sortBy === column.id} - direction={sortDirection} - hideSortIcon - onClick={onSortBy(column.id)} - > - {label} - </TableSortLabel> - </Tooltip> - <Tooltip - title={description} - enterDelay={300} - > - <IconButton> - <InfoIcon /> - </IconButton> - </Tooltip> - </TableCell> + <React.Fragment key={column.id}> + {column.disableSort + ? ( + <TableCell + className={classes.headerCol} + > + {label} + <Tooltip + title={description} + enterDelay={300} + > + <IconButton> + <InfoIcon /> + </IconButton> + </Tooltip> + </TableCell> + ) : ( + <TableCell + className={classes.headerCol} + sortDirection={sortBy === column.id ? sortDirection : false} + > + <Tooltip + title={`Sort by ${label}`} + enterDelay={300} + > + <TableSortLabel + active={sortBy === column.id} + direction={sortDirection} + hideSortIcon + onClick={onSortBy(column.id)} + > + {label} + </TableSortLabel> + </Tooltip> + <Tooltip + title={description} + enterDelay={300} + > + <IconButton> + <InfoIcon /> + </IconButton> + </Tooltip> + </TableCell> + )} + </React.Fragment> ) })} </TableRow> diff --git a/src/client/components/main_layout/Footer.js b/src/client/components/main_layout/Footer.js index df75a31f93b63a8c468cf892806b826d62298909..d51daaf1a212ee858c649886a53a5001d7b04abc 100644 --- a/src/client/components/main_layout/Footer.js +++ b/src/client/components/main_layout/Footer.js @@ -8,7 +8,7 @@ import oxfordLogo2 from '../../img/logos/partners/Long-Logo-RGB.jpg' import pennLogo from '../../img/logos/partners/PL SIMS Logo_small.png' import cnrsLogo from '../../img/logos/partners/logo_cnrs_irht2.jpg' import aaltoLogo from '../../img/logos/partners/Aalto_SCI_EN_13_BLACK_2_cropped.png' -import secoLogo from '../../img/logos/partners/13_9_04_logo_cropped_small.png' +// import secoLogo from '../../img/logos/partners/13_9_04_logo_cropped_small.png' import tapLogo from '../../img/logos/funders/cropped-logo_tap_0_.png' import didLogo from '../../img/logos/funders/did_logo.png' import imlsLogo from '../../img/logos/funders/imls_logo_2c_cropped.jpg' @@ -60,39 +60,61 @@ const Footer = props => { <Grid container className={classes.layout}> <Grid container spacing={3} item xs={12}> <Grid item xs className={classes.logoContainer}> - <img className={classes.logo} src={oxfordLogo} alt='logo' /> + <a href='http://www.ox.ac.uk' target='_blank' rel='noopener noreferrer'> + <img className={classes.logo} src={oxfordLogo} alt='logo' /> + </a> </Grid> <Grid item xs className={classes.logoContainer}> - <img className={classes.logo} src={oxfordLogo2} alt='logo' /> + <a href='http://www.oerc.ox.ac.uk' target='_blank' rel='noopener noreferrer'> + <img className={classes.logo} src={oxfordLogo2} alt='logo' /> + </a> </Grid> <Grid item xs className={classes.logoContainer}> - <img className={classes.logo} src={pennLogo} alt='logo' /> + <a href='https://schoenberginstitute.org' target='_blank' rel='noopener noreferrer'> + <img className={classes.logo} src={pennLogo} alt='logo' /> + </a> </Grid> <Grid item xs className={classes.logoContainer}> - <img className={classes.logo} src={cnrsLogo} alt='logo' /> + <a href='https://www.irht.cnrs.fr/?q=en' target='_blank' rel='noopener noreferrer'> + <img className={classes.logo} src={cnrsLogo} alt='logo' /> + </a> </Grid> + {/* <Grid item xs className={classes.logoContainer}> + <a href='https://seco.cs.aalto.fi/projects/mmm' target='_blank' rel='noopener noreferrer'> + <img className={classes.logo} src={secoLogo} alt='logo' /> + </a> + </Grid> */} <Grid item xs className={classes.logoContainer}> - <img className={classes.logo} src={secoLogo} alt='logo' /> - </Grid> - <Grid item xs className={classes.logoContainer}> - <img className={classes.aaltoLogo} src={aaltoLogo} alt='logo' /> + <a href='https://www.aalto.fi/en/school-of-science' target='_blank' rel='noopener noreferrer'> + <img className={classes.aaltoLogo} src={aaltoLogo} alt='logo' /> + </a> </Grid> </Grid> <Grid container spacing={3} item xs={12}> <Grid item xs className={classes.logoContainer}> - <img className={classes.logo} src={tapLogo} alt='logo' /> + <a href='https://www.transatlanticplatform.com' target='_blank' rel='noopener noreferrer'> + <img className={classes.logo} src={tapLogo} alt='logo' /> + </a> </Grid> <Grid item xs className={classes.logoContainer}> - <img className={classes.logo} src={didLogo} alt='logo' /> + <a href='https://diggingintodata.org/awards/2016/project/mapping-manuscript-migrations-digging-data-history-and-provenance-pre-modern' target='_blank' rel='noopener noreferrer'> + <img className={classes.logo} src={didLogo} alt='logo' /> + </a> </Grid> <Grid item xs className={classes.logoContainer}> - <img className={classes.logo} src={imlsLogo} alt='logo' /> + <a href='https://www.imls.gov' target='_blank' rel='noopener noreferrer'> + <img className={classes.logo} src={imlsLogo} alt='logo' /> + </a> </Grid> <Grid item xs className={classes.logoContainer}> - <img className={classes.logo} src={anrLogo} alt='logo' /> + <a href='https://anr.fr/en' target='_blank' rel='noopener noreferrer'> + <img className={classes.logo} src={anrLogo} alt='logo' /> + </a> </Grid> <Grid item xs className={classes.logoContainer}> - <img className={classes.logo} src={akaLogo} alt='logo' /> + <a href='https://www.aka.fi/en' target='_blank' rel='noopener noreferrer'> + <img className={classes.logo} src={akaLogo} alt='logo' /> + </a> </Grid> </Grid> </Grid> diff --git a/src/client/components/main_layout/Main.js b/src/client/components/main_layout/Main.js index dfce2a38de2cac2fcc75c0968e8c7176a6c8f351..fe00cfa8656506f5435560a32092cb9b418411a8 100644 --- a/src/client/components/main_layout/Main.js +++ b/src/client/components/main_layout/Main.js @@ -1,19 +1,15 @@ import React from 'react' import PropTypes from 'prop-types' import intl from 'react-intl-universal' -import classNames from 'classnames' -import Card from '@material-ui/core/Card' -import CardActionArea from '@material-ui/core/CardActionArea' -import CardContent from '@material-ui/core/CardContent' -import CardMedia from '@material-ui/core/CardMedia' import Grid from '@material-ui/core/Grid' import Typography from '@material-ui/core/Typography' -import { withStyles } from '@material-ui/core/styles' -import { Link } from 'react-router-dom' -import { has } from 'lodash' -import defaultThumbImage from '../../img/thumb.png' +import { makeStyles } from '@material-ui/core/styles' +import useMediaQuery from '@material-ui/core/useMediaQuery' +import MainCard from './MainCard' +import bannerImage from '../../img/mmm-banner.jpg' +import mmmLogo from '../../img/mmm-logo-94x90.png' -const styles = theme => ({ +const useStyles = makeStyles(theme => ({ root: { width: '100%', marginBottom: theme.spacing(1), @@ -22,16 +18,48 @@ const styles = theme => ({ overflow: 'auto' } }, - icon: { - marginRight: theme.spacing(2) + banner: { + background: `linear-gradient( rgba(0, 0, 0, 0.45), rgba(0, 0, 0, 0.45) ), url(${bannerImage})`, + backgroundRepeat: 'no-repeat', + backgroundSize: 'cover', + backgroundPosition: 'center', + height: 220, + [theme.breakpoints.up('xl')]: { + height: 300 + }, + width: '100%', + boxShadow: '0 -15px 15px 0px #bdbdbd inset', + display: 'flex', + alignItems: 'center', + justifyContent: 'center' }, - link: { - textDecoration: 'none' + bannerContent: { + display: 'inline-block', + color: '#fff' }, - heroContent: { - maxWidth: 1100, - paddingTop: theme.spacing(3), - paddingBottom: theme.spacing(1) + firstLetter: { + [theme.breakpoints.down('xs')]: { + height: 20 + }, + [theme.breakpoints.between('xs', 'md')]: { + height: 40 + }, + [theme.breakpoints.between('md', 'xl')]: { + height: 50, + marginRight: 2 + }, + [theme.breakpoints.up('xl')]: { + height: 88, + marginRight: 4 + } + }, + bannerSubheading: { + marginTop: theme.spacing(1.5), + display: 'flex', + '& div': { + flexGrow: 1, + width: 0 + } }, layout: { width: 'auto', @@ -43,97 +71,142 @@ const styles = theme => ({ marginRight: 'auto' } }, - media: { - height: 100, - [theme.breakpoints.down('md')]: { - height: 60 - } + heroContent: { + paddingTop: theme.spacing(3), + paddingBottom: theme.spacing(1) + }, + licenceText: { + marginTop: theme.spacing(0.5), + fontSize: '0.7em' + }, + lowerRow: { + marginTop: theme.spacing(1) }, - cardContent: { - height: 85 + licenceTextContainer: { + marginTop: theme.spacing(1), + display: 'flex', + justifyContent: 'center' } -}) +})) const Main = props => { - const { classes } = props + const { perspectives } = props + const classes = useStyles(props) + const xsScreen = useMediaQuery(theme => theme.breakpoints.down('xs')) + const smScreen = useMediaQuery(theme => theme.breakpoints.between('sm', 'md')) + const mdScreen = useMediaQuery(theme => theme.breakpoints.between('md', 'lg')) + const lgScreen = useMediaQuery(theme => theme.breakpoints.between('lg', 'xl')) + const xlScreen = useMediaQuery(theme => theme.breakpoints.up('xl')) + let headingVariant = 'h5' + let subheadingVariant = 'body1' + let descriptionVariant = 'body1' + if (smScreen) { + headingVariant = 'h4' + subheadingVariant = 'h6' + descriptionVariant = 'h6' + } + if (mdScreen) { + headingVariant = 'h3' + subheadingVariant = 'h6' + descriptionVariant = 'h6' + } + if (lgScreen) { + headingVariant = 'h2' + subheadingVariant = 'h5' + descriptionVariant = 'h6' + } + if (xlScreen) { + headingVariant = 'h1' + subheadingVariant = 'h4' + descriptionVariant = 'h6' + } + + const gridForLargeScreen = () => { + const upperRowItems = [] + const lowerRowItems = [] + for (let i = 0; i < 3; i++) { + const perspective = perspectives[i] + upperRowItems.push( + <MainCard + key={perspective.id} + perspective={perspective} + cardHeadingVariant='h4' + />) + } + for (let i = 3; i < 5; i++) { + const perspective = perspectives[i] + lowerRowItems.push( + <MainCard + key={perspective.id} + perspective={perspective} + cardHeadingVariant='h4' + />) + } + return ( + <> + <Grid container spacing={3}> + {upperRowItems} + </Grid> + <Grid className={classes.lowerRow} container justify='center' spacing={3}> + {lowerRowItems} + </Grid> + </> + ) + } + + const basicGrid = () => + <> + <Grid container spacing={smScreen ? 2 : 1} justify={xsScreen || smScreen ? 'center' : 'flex-start'}> + {props.perspectives.map(perspective => + <MainCard + key={perspective.id} + perspective={perspective} + cardHeadingVariant='h5' + />)} + </Grid> + </> + return ( <div className={classes.root}> + <div className={classes.banner}> + <div className={classes.bannerContent}> + <div className={classes.bannerHeading}> + <img className={classes.firstLetter} src={mmmLogo} /> + <Typography component='span' variant={headingVariant} align='center'> + {intl.get('appTitle.long')} + </Typography> + </div> + <div className={classes.bannerSubheading}> + <div> + <Typography component='h2' variant={subheadingVariant} align='center'> + {intl.get('appTitle.subheading')} + </Typography> + </div> + </div> + + </div> + + </div> <div className={classes.layout}> <div className={classes.heroContent}> - <Typography component='h1' variant='h3' align='center' color='textPrimary' gutterBottom> - {intl.get('appTitle.long')} + <Typography variant={descriptionVariant} color='textPrimary' paragraph> + {intl.getHTML('appDescription')} </Typography> - <Typography variant='h6' align='center' color='textSecondary' paragraph> - {intl.get('appDescription')} - </Typography> - <Typography variant='h6' align='center' color='textSecondary' paragraph> + <Typography variant={descriptionVariant} align='center' color='textPrimary' paragraph> {intl.get('selectPerspective')} </Typography> </div> - </div> - <div className={classNames(classes.layout, classes.cardGrid)}> - <Grid container spacing={5}> - {props.perspectives.map(perspective => { - return ( - <Grid key={perspective.id} item xs={12} sm={6} md={4}> - <Card className={classes.card}> - {has(perspective, 'externalUrl') && - <a - className={classes.link} - href={perspective.externalUrl} - target='_blank' - rel='noopener noreferrer' - > - <CardActionArea> - <CardMedia - className={classes.media} - image={has(perspective, 'thumbImage') - ? perspective.thumbImage - : defaultThumbImage} - title={perspective.label} - /> - <CardContent className={classes.cardContent}> - <Typography gutterBottom variant='h5' component='h2'> - {intl.get(`perspectives.${perspective.id}.label`)} - </Typography> - <Typography component='p'> - {intl.get(`perspectives.${perspective.id}.shortDescription`)} - </Typography> - </CardContent> - </CardActionArea> - </a>} - {!has(perspective, 'externalUrl') && - <CardActionArea component={Link} to={`/${perspective.id}/faceted-search`}> - <CardMedia - className={classes.media} - image={has(perspective, 'thumbImage') - ? perspective.thumbImage - : defaultThumbImage} - title={perspective.label} - /> - <CardContent className={classes.cardContent}> - <Typography gutterBottom variant='h5' component='h2'> - {intl.get(`perspectives.${perspective.id}.label`)} - </Typography> - <Typography component='p'> - {intl.get(`perspectives.${perspective.id}.shortDescription`)} - </Typography> - </CardContent> - </CardActionArea>} - </Card> - </Grid> - ) - } - )} - </Grid> + {xlScreen ? gridForLargeScreen() : basicGrid()} + <div className={classes.licenceTextContainer}> + <Typography className={classes.licenceText}>{intl.getHTML('mainPageImageLicence')}</Typography> + </div> </div> </div> ) } Main.propTypes = { - classes: PropTypes.object.isRequired, perspectives: PropTypes.array.isRequired } -export default withStyles(styles)(Main) +export default Main diff --git a/src/client/components/main_layout/MainCard.js b/src/client/components/main_layout/MainCard.js new file mode 100644 index 0000000000000000000000000000000000000000..b3f06565825ea97856c4ba0f70c590d81240a5d0 --- /dev/null +++ b/src/client/components/main_layout/MainCard.js @@ -0,0 +1,81 @@ +import React from 'react' +import PropTypes from 'prop-types' +import Typography from '@material-ui/core/Typography' +import Paper from '@material-ui/core/Paper' +import Grid from '@material-ui/core/Grid' +import intl from 'react-intl-universal' +import { makeStyles } from '@material-ui/core/styles' +import useMediaQuery from '@material-ui/core/useMediaQuery' +import { Link } from 'react-router-dom' + +const useStyles = makeStyles(theme => ({ + gridItem: { + textDecoration: 'none', + [theme.breakpoints.down('xs')]: { + justifyContent: 'center' + } + }, + perspectiveCard: props => ({ + padding: theme.spacing(1.5), + color: '#fff', + background: `linear-gradient( rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0.4) ), url(${props.perspective.frontPageImage})`, + backgroundRepeat: 'no-repeat', + backgroundSize: 'cover', + backgroundPosition: 'center', + '&:hover': { + background: `linear-gradient( rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.8) ), url(${props.perspective.frontPageImage})`, + backgroundRepeat: 'no-repeat', + backgroundSize: 'cover', + backgroundPosition: 'center' + }, + [theme.breakpoints.down('xs')]: { + width: 351 - theme.spacing(3), + height: 180 + }, + [theme.breakpoints.between(600, 780)]: { + height: 180 + }, + [theme.breakpoints.between(780, 960)]: { + height: 238 + }, + [theme.breakpoints.between('md', 'lg')]: { + height: 100 + }, + [theme.breakpoints.up('xl')]: { + height: 180 + } + }) +})) + +const MainCard = props => { + const classes = useStyles(props) + const { perspective, cardHeadingVariant } = props + const xsScreen = useMediaQuery(theme => theme.breakpoints.down('xs')) + // const smScreen = useMediaQuery(theme => theme.breakpoints.between('sm', 'md')) + return ( + <Grid + className={classes.gridItem} + key={perspective.id} + item xs={12} sm={6} md lg xl={4} + component={Link} + to={`/${perspective.id}/faceted-search`} + container={xsScreen} + > + <Paper className={classes.perspectiveCard}> + <Typography gutterBottom variant={cardHeadingVariant} component='h2'> + {intl.get(`perspectives.${perspective.id}.label`)} + </Typography> + <Typography component='p'> + {intl.get(`perspectives.${perspective.id}.shortDescription`)} + </Typography> + </Paper> + </Grid> + ) +} + +MainCard.propTypes = { + perspective: PropTypes.object.isRequired, + cardHeadingVariant: PropTypes.string.isRequired +} + +export default MainCard diff --git a/src/client/components/main_layout/TopBar.js b/src/client/components/main_layout/TopBar.js index a7f89316fbc0e88eb5b9f8d96f65a153800a9e8b..4e0aa66d8c710bab5206252c72f80561cb9f9471 100644 --- a/src/client/components/main_layout/TopBar.js +++ b/src/client/components/main_layout/TopBar.js @@ -16,6 +16,8 @@ import TopBarInfoButton from './TopBarInfoButton' // import TopBarLanguageButton from './TopBarLanguageButton'; import Divider from '@material-ui/core/Divider' import { has } from 'lodash' +import mmmLogo from '../../img/mmm-logo-52x50.png' +import secoLogo from '../../img/seco-logo-48x50.png' const styles = theme => ({ root: { @@ -24,8 +26,9 @@ const styles = theme => ({ grow: { flexGrow: 1 }, - title: { - // + toolbar: { + paddingLeft: theme.spacing(1.5), + paddingRight: theme.spacing(1.5) }, sectionDesktop: { display: 'none', @@ -53,6 +56,12 @@ const styles = theme => ({ marginLeft: theme.spacing(1), marginRight: theme.spacing(1), borderLeft: '2px solid white' + }, + secoLogo: { + marginLeft: theme.spacing(1), + [theme.breakpoints.down('md')]: { + display: 'none' + } } }) @@ -165,7 +174,7 @@ class TopBar extends React.Component { component={this.AdapterLink} to='/about' > - {intl.get('topBar.info.aboutTheProject').toUpperCase()} + {intl.get('topBar.info.aboutThePortal').toUpperCase()} </MenuItem> <a className={this.props.classes.link} @@ -191,20 +200,18 @@ class TopBar extends React.Component { const { classes, perspectives /* currentLocale, availableLocales */ } = this.props return ( <div className={classes.root}> + {/* Add an empty Typography element to ensure that that the MuiTypography class is loaded for + any lower level components that use MuiTypography class only in translation files */} + <Typography /> <AppBar position='absolute'> - <Toolbar> - <Button - className={classes.appBarButton} - component={this.AdapterLink} - to='/' - > - <Typography className={classes.title} variant='h6' color='inherit'> - {intl.get('appTitle.short')} - </Typography> + <Toolbar className={classes.toolbar}> + <Button component={this.AdapterLink} to='/'> + <img src={mmmLogo} /> </Button> <TopBarSearchField fetchResultsClientSide={this.props.fetchResultsClientSide} clearResults={this.props.clearResults} + xsScreen={this.props.xsScreen} /> <div className={classes.grow} /> <div className={classes.sectionDesktop}> @@ -229,12 +236,21 @@ class TopBar extends React.Component { > {intl.get('topBar.instructions')} </Button> + {/* <TopBarLanguageButton currentLocale={currentLocale} availableLocales={availableLocales} loadLocales={this.props.loadLocales} /> */} </div> + <a + className={classes.secoLogo} + href='https://seco.cs.aalto.fi/projects/mmm' + target='_blank' + rel='noopener noreferrer' + > + <Button><img src={secoLogo} /></Button> + </a> <div className={classes.sectionMobile}> <IconButton aria-haspopup='true' onClick={this.handleMobileMenuOpen} color='inherit'> <MoreIcon /> @@ -255,7 +271,8 @@ TopBar.propTypes = { loadLocales: PropTypes.func.isRequired, perspectives: PropTypes.array.isRequired, currentLocale: PropTypes.string.isRequired, - availableLocales: PropTypes.array.isRequired + availableLocales: PropTypes.array.isRequired, + xsScreen: PropTypes.bool.isRequired } export default withStyles(styles)(TopBar) diff --git a/src/client/components/main_layout/TopBarInfoButton.js b/src/client/components/main_layout/TopBarInfoButton.js index 026768a1423a3df79bd7bb6d20bbcf7eca3ce7e1..ba169785fed26b25ff9822c49e9571cab0c1ae3e 100644 --- a/src/client/components/main_layout/TopBarInfoButton.js +++ b/src/client/components/main_layout/TopBarInfoButton.js @@ -66,7 +66,7 @@ class TopBarInfoButton extends React.Component { to='/about' onClick={this.handleInfoMenuClose} > - {intl.get('topBar.info.aboutTheProject')} + {intl.get('topBar.info.aboutThePortal')} </MenuItem> <a className={classes.link} diff --git a/src/client/components/main_layout/TopBarSearchField.js b/src/client/components/main_layout/TopBarSearchField.js index 5af6ad13f89596f48307809d65b99c5cfd209213..dda1cabd7fc3aa38075319c14e95352910a98e04 100644 --- a/src/client/components/main_layout/TopBarSearchField.js +++ b/src/client/components/main_layout/TopBarSearchField.js @@ -91,14 +91,15 @@ class TopBarSearchField extends React.Component { } render () { - const { classes } = this.props + const { classes, xsScreen } = this.props + const placeholder = xsScreen ? intl.get('topBar.searchBarPlaceHolderShort') : intl.get('topBar.searchBarPlaceHolder') return ( <div className={classes.search}> <div className={classes.searchIcon}> <SearchIcon /> </div> <InputBase - placeholder={intl.get('topBar.searchBarPlaceHolder')} + placeholder={placeholder} classes={{ root: classes.inputRoot, input: classes.inputInput @@ -114,7 +115,8 @@ class TopBarSearchField extends React.Component { TopBarSearchField.propTypes = { classes: PropTypes.object.isRequired, fetchResultsClientSide: PropTypes.func.isRequired, - clearResults: PropTypes.func.isRequired + clearResults: PropTypes.func.isRequired, + xsScreen: PropTypes.bool.isRequired } export default withStyles(styles)(TopBarSearchField) diff --git a/src/client/configs/mmm/PerspectiveConfig.js b/src/client/configs/mmm/PerspectiveConfig.js index 7991faaaedff29abb66848ac5bb34707db16edc5..351d889e39c709c60533b51a92ca67bfafaeed40 100644 --- a/src/client/configs/mmm/PerspectiveConfig.js +++ b/src/client/configs/mmm/PerspectiveConfig.js @@ -4,10 +4,16 @@ import AddLocationIcon from '@material-ui/icons/AddLocation' import LocationOnIcon from '@material-ui/icons/LocationOn' import RedoIcon from '@material-ui/icons/Redo' import CloudDownloadIcon from '@material-ui/icons/CloudDownload' +import manuscriptsImage from '../../img/manuscripts-452x262.jpg' +import worksImage from '../../img/works-452x262_2.jpg' +import eventsImage from '../../img/events-452x262.jpg' +import actorsImage from '../../img/actors-452x262_2.jpg' +import placesImage from '../../img/places-452x262_2.jpg' export const perspectiveConfig = [ { id: 'manuscripts', + frontPageImage: manuscriptsImage, perspectiveDescHeight: 160, defaultActiveFacets: new Set(['prefLabel']), tabs: [ @@ -53,6 +59,7 @@ export const perspectiveConfig = [ }, { id: 'works', + frontPageImage: worksImage, perspectiveDescHeight: 160, defaultActiveFacets: new Set(['prefLabel']), tabs: [ @@ -82,6 +89,7 @@ export const perspectiveConfig = [ }, { id: 'events', + frontPageImage: eventsImage, perspectiveDescHeight: 160, defaultActiveFacets: new Set(['type']), tabs: [ @@ -122,6 +130,7 @@ export const perspectiveConfig = [ }, { id: 'actors', + frontPageImage: actorsImage, perspectiveDescHeight: 160, defaultActiveFacets: new Set(['prefLabel']), tabs: [ @@ -156,6 +165,7 @@ export const perspectiveConfig = [ }, { id: 'places', + frontPageImage: placesImage, perspectiveDescHeight: 160, defaultActiveFacets: new Set(['prefLabel']), tabs: [ diff --git a/src/client/containers/SemanticPortal.js b/src/client/containers/SemanticPortal.js index 5bd84e29f136b9a08fbfba7b05fb64e1c47f5f68..2e8f28a28b94e15b0870a50b87d4210a41a3bde5 100644 --- a/src/client/containers/SemanticPortal.js +++ b/src/client/containers/SemanticPortal.js @@ -5,6 +5,7 @@ import { connect } from 'react-redux' import { withStyles } from '@material-ui/core/styles' import withWidth from '@material-ui/core/withWidth' import { withRouter, Route } from 'react-router-dom' +import classNames from 'classnames' import compose from 'recompose/compose' import Grid from '@material-ui/core/Grid' import TopBar from '../components/main_layout/TopBar' @@ -23,6 +24,7 @@ import TextPage from '../components/main_layout/TextPage' import { perspectiveConfig } from '../configs/mmm/PerspectiveConfig' import { perspectiveConfigOnlyInfoPages } from '../configs/mmm/PerspectiveConfigOnlyInfoPages' import InfoHeader from '../components/main_layout/InfoHeader' +import useMediaQuery from '@material-ui/core/useMediaQuery' import { has } from 'lodash' import { fetchResultCount, @@ -70,11 +72,9 @@ const styles = theme => ({ }, mainContainer: { height: 'auto', - width: '100%', [theme.breakpoints.up('md')]: { height: 'calc(100% - 80px)' // 100% - app bar - padding }, - padding: theme.spacing(1), [theme.breakpoints.down('sm')]: { marginTop: 56 // app bar }, @@ -82,6 +82,10 @@ const styles = theme => ({ marginTop: 64 // app bar } }, + textPageContainer: { + width: '100%', + padding: theme.spacing(1) + }, perspectiveContainer: { height: 'auto', [theme.breakpoints.up('md')]: { @@ -167,6 +171,7 @@ const styles = theme => ({ const SemanticPortal = props => { const { classes, /* browser */ error } = props + const xsScreen = useMediaQuery(theme => theme.breakpoints.down('xs')) const renderPerspective = (perspective, routeProps) => { let perspectiveElement = null @@ -276,6 +281,7 @@ const SemanticPortal = props => { currentLocale={props.options.currentLocale} availableLocales={props.options.availableLocales} loadLocales={props.loadLocales} + xsScreen={xsScreen} /> <Route exact path='/' @@ -427,21 +433,21 @@ const SemanticPortal = props => { <Route path='/feedback' render={() => - <div className={classes.mainContainer}> + <div className={classNames(classes.mainContainer, classes.textPageContainer)}> <TextPage>{intl.getHTML('feedback')}</TextPage> </div>} /> <Route path='/about' render={() => - <div className={classes.mainContainer}> - <TextPage>{intl.getHTML('aboutTheProject')}</TextPage> + <div className={classNames(classes.mainContainer, classes.textPageContainer)}> + <TextPage>{intl.getHTML('aboutThePortal')}</TextPage> </div>} /> <Route path='/instructions' render={() => - <div className={classes.mainContainer}> + <div className={classNames(classes.mainContainer, classes.textPageContainer)}> <TextPage>{intl.getHTML('instructions')}</TextPage> </div>} /> diff --git a/src/client/img/actors-452x262.jpg b/src/client/img/actors-452x262.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8086e973dade2ba4f9ab0ae6d249df76c32c96c0 Binary files /dev/null and b/src/client/img/actors-452x262.jpg differ diff --git a/src/client/img/actors-452x262_2.jpg b/src/client/img/actors-452x262_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b6fe6bcf5490db4c20e75bdf1aaa0af8b7722334 Binary files /dev/null and b/src/client/img/actors-452x262_2.jpg differ diff --git a/src/client/img/events-452x262.jpg b/src/client/img/events-452x262.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a6bfbfefb03d448ef20c4b6946473938a103982f Binary files /dev/null and b/src/client/img/events-452x262.jpg differ diff --git a/src/client/img/manuscripts-452x262.jpg b/src/client/img/manuscripts-452x262.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c1aab8c995e35b2e4637d121c4de8ce09669078 Binary files /dev/null and b/src/client/img/manuscripts-452x262.jpg differ diff --git a/src/client/img/mmm-banner.jpg b/src/client/img/mmm-banner.jpg new file mode 100644 index 0000000000000000000000000000000000000000..862be49ad9012708b5ffab3231b6427363e0ec13 Binary files /dev/null and b/src/client/img/mmm-banner.jpg differ diff --git a/src/client/img/mmm-logo-52x50.png b/src/client/img/mmm-logo-52x50.png new file mode 100644 index 0000000000000000000000000000000000000000..7cb7ebfc7cf9e57716ce6aa8e760c375eb6ded06 Binary files /dev/null and b/src/client/img/mmm-logo-52x50.png differ diff --git a/src/client/img/mmm-logo-94x90.png b/src/client/img/mmm-logo-94x90.png new file mode 100644 index 0000000000000000000000000000000000000000..8832c0d824768e1f01330562f9baf9ffc48e6af0 Binary files /dev/null and b/src/client/img/mmm-logo-94x90.png differ diff --git a/src/client/img/places-452x262.jpg b/src/client/img/places-452x262.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4e80280ad4e197b502f48970a97d51a814c7c8cb Binary files /dev/null and b/src/client/img/places-452x262.jpg differ diff --git a/src/client/img/places-452x262_2.jpg b/src/client/img/places-452x262_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..76056528a004fa367f0c435b8e24f3beb08cd465 Binary files /dev/null and b/src/client/img/places-452x262_2.jpg differ diff --git a/src/client/img/seco-logo-48x50.png b/src/client/img/seco-logo-48x50.png new file mode 100644 index 0000000000000000000000000000000000000000..b3fcd44ee586b5a44102e19245de7ef36609389f Binary files /dev/null and b/src/client/img/seco-logo-48x50.png differ diff --git a/src/client/img/works-452x262.jpg b/src/client/img/works-452x262.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0a6224213e61fa15762e62741a037e9b7f60bb8b Binary files /dev/null and b/src/client/img/works-452x262.jpg differ diff --git a/src/client/img/works-452x262_2.jpg b/src/client/img/works-452x262_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5f61e74db1117242f7793f39070716cad6f02724 Binary files /dev/null and b/src/client/img/works-452x262_2.jpg differ diff --git a/src/client/reducers/mmm/actors.js b/src/client/reducers/mmm/actors.js index d4310af7bb3705dc602564775e2640a95cccbf13..bf218cbd9abea61586d3ba249db66a1f7d8de03e 100644 --- a/src/client/reducers/mmm/actors.js +++ b/src/client/reducers/mmm/actors.js @@ -116,7 +116,8 @@ export const INITIAL_STATE = { externalLink: false, sortValues: true, numberedList: false, - minWidth: 250 + minWidth: 250, + disableSort: true }, { id: 'role', @@ -125,7 +126,8 @@ export const INITIAL_STATE = { externalLink: false, sortValues: true, numberedList: false, - minWidth: 250 + minWidth: 250, + disableSort: true }, { id: 'source', diff --git a/src/client/reducers/mmm/clientSideFacetedSearch.js b/src/client/reducers/mmm/clientSideFacetedSearch.js index 768e487f3bf65fca5e13ab01d2ef9540bd464718..5335d7fc132f8a607a2b16d69bc47c0869cceede 100644 --- a/src/client/reducers/mmm/clientSideFacetedSearch.js +++ b/src/client/reducers/mmm/clientSideFacetedSearch.js @@ -63,11 +63,11 @@ const clientSideFacetedSearch = (state = INITIAL_STATE, action) => { return state } } else return state -}; +} const updateResultsFilter = (state, action) => { const { property, value, latestValues } = action.filterObj - let nSet = state.resultsFilter[property] + const nSet = state.resultsFilter[property] if (nSet.has(value)) { nSet.delete(value) } else { @@ -85,6 +85,6 @@ const updateResultsFilter = (state, action) => { }, latestFilterValues: latestValues } -}; +} export default clientSideFacetedSearch diff --git a/src/client/translations/mmm/localeEN.js b/src/client/translations/mmm/localeEN.js index c6bdeecd73c58987fba5537eda8f8ee394232262..e27ed4bcf1e3e0bb71a564e2ca980b145e801d85 100644 --- a/src/client/translations/mmm/localeEN.js +++ b/src/client/translations/mmm/localeEN.js @@ -2,23 +2,29 @@ export default { languageLabel: 'English', appTitle: { short: 'mmm', - long: 'Mapping Manuscript Migrations' + long: 'apping Manuscript Migrations', + subheading: `Navigating the network of connections between people, institutions, and + places within European medieval and Renaissance manuscripts` }, appDescription: ` Mapping Manuscript Migrations (MMM) is a semantic portal for finding and studying pre-modern manuscripts and - their movements, based on linked collections of Schoenberg Institute, Bodleian Library, - and IRHT. + their movements, based on linked collections of + <a href='https://sdbm.library.upenn.edu' target='_blank' rel='noopener noreferrer'>Schoenberg Institute,</a> + <a href='https://medieval.bodleian.ox.ac.uk' target='_blank' rel='noopener noreferrer'>Bodleian Library</a>, and + <a href='http://bibale.irht.cnrs.fr' target='_blank' rel='noopener noreferrer'>Institut de recherche et d'histoire des textes</a>. `, selectPerspective: 'Select a perspective to search and browse the MMM data:', + mainPageImageLicence: 'Images used under license from Shutterstock.com', topBar: { feedback: 'feedback', info: { info: 'Info', - blog: 'Blog', + blog: 'Project blog', blogUrl: 'http://blog.mappingmanuscriptmigrations.org', - aboutTheProject: 'About the project' + aboutThePortal: 'About the Portal' }, searchBarPlaceHolder: 'Search all MMM content', + searchBarPlaceHolderShort: 'Search', instructions: 'instructions' }, facetBar: { @@ -300,7 +306,7 @@ export default { works: { label: 'Works', facetResultsType: 'works', - shortDescription: 'Intellectual content carried out by manuscripts.', + shortDescription: 'Intellectual content of manuscripts', longDescription: ` <p class="MuiTypography-root MuiTypography-body1 MuiTypography-paragraph"> Use this perspective to access data related to Works. The MMM data model follows @@ -410,7 +416,7 @@ export default { events: { label: 'Events', facetResultsType: 'events', - shortDescription: 'Events related to manuscripts.', + shortDescription: 'Events related to manuscripts', longDescription: ` <p class="MuiTypography-root MuiTypography-body1 MuiTypography-paragraph"> Use this perspective to access data related to events associated with the @@ -517,7 +523,7 @@ export default { actors: { label: 'Actors', facetResultsType: 'actors', - shortDescription: 'People and institutions related to manuscripts and works.', + shortDescription: 'People and institutions related to manuscripts', longDescription: ` <p class="MuiTypography-root MuiTypography-body1 MuiTypography-paragraph"> This perspective provides access to data related to the persons and institutions @@ -625,7 +631,7 @@ export default { places: { label: 'Places', facetResultsType: 'places', - shortDescription: 'Places related to manuscripts and works.', + shortDescription: 'Places related to manuscripts', longDescription: ` <p class="MuiTypography-root MuiTypography-body1 MuiTypography-paragraph"> Use this perspective to access data related to places named in the source datasets @@ -829,12 +835,12 @@ export default { } } }, - aboutTheProject: ` + aboutThePortal: ` <h1 class="MuiTypography-root MuiTypography-h2 MuiTypography-gutterBottom"> - About the project + About the Portal </h1> <p class="MuiTypography-root MuiTypography-body1 MuiTypography-paragraph"> - Mapping Manuscript Migrations (MMM) has been developed with funding from the Trans-Atlantic + Mapping Manuscript Migrations (MMM) Portal has been developed with funding from the Trans-Atlantic Platform under its Digging into Data Challenge (2017-2019). The partners in this project are the University of Oxford, the University of Pennsylvania, Aalto University, and the Institut de recherche et d’histoire des textes. @@ -843,14 +849,14 @@ export default { Agence nationale de la recherche. </p> <p class="MuiTypography-root MuiTypography-body1 MuiTypography-paragraph"> - MMM is intended to enable large-scale exploration of data relating to the history and provenance + MMM Portal is intended to enable large-scale exploration of data relating to the history and provenance of (primarily) Western European medieval and early modern manuscripts. </p> <h2 class="MuiTypography-root MuiTypography-h4 MuiTypography-gutterBottom"> Data </h2> <p class="MuiTypography-root MuiTypography-body1 MuiTypography-paragraph"> - MMM combines data from three specialist databases: + MMM Portal combines data from three specialist databases: </p> <ul class="MuiTypography-root MuiTypography-body1 MuiTypography-gutterBottom"> <li> @@ -886,13 +892,13 @@ export default { Features </h2> <p class="MuiTypography-root MuiTypography-body1 MuiTypography-paragraph"> - The MMM interface enables you to browse and search through most of the data assembled by the project + The MMM Portal enables you to browse and search through most of the data assembled by the MMM project from the three source databases. If you want to inspect the full raw data for any individual manuscript or other entity, please click on the “Open in Linked Data browser†button on the “Export†tab of the landing-page for that entity. </p> <p class="MuiTypography-root MuiTypography-body1 MuiTypography-paragraph"> - The MMM interface also provides map-based visualizations for a selection of the data relating to + The MMM Portal also provides map-based visualizations for a selection of the data relating to Manuscripts, Actors, and Places. The data resulting from a search or a filtered browse can be exported in the form of a CSV file. Click on the “Export†tab and then on the button “Open SPARQL query in yasgui.orgâ€. diff --git a/src/server/sparql/FacetConfigsMMM.js b/src/server/sparql/FacetConfigsMMM.js index 89a7ace09ac42a01c42957f0973043add7d3df30..82e486dad277e85556d6337a00e827c8b1e32460 100644 --- a/src/server/sparql/FacetConfigsMMM.js +++ b/src/server/sparql/FacetConfigsMMM.js @@ -331,7 +331,11 @@ export const facetConfigs = { }, type: { predicate: 'a', - facetValueFilter: '', + facetValueFilter: ` + FILTER(?id NOT IN ( + <http://ldf.fi/mmm/schema/PlaceNationality> + )) + `, type: 'list', labelPath: 'a/(skos:prefLabel|rdfs:label)' },