From 588ef6cb8c29d655dc2b3b77591852aac93494b7 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Tue, 6 Oct 2020 18:30:59 +0300 Subject: [PATCH 01/78] Add email content editor to SignupForm --- package-lock.json | 272 ++++++++++++++++---- package.json | 2 + src/components/SignupEmailContentWidget.tsx | 38 +++ src/pages/admin/SignupCreatePage.tsx | 15 +- 4 files changed, 269 insertions(+), 58 deletions(-) create mode 100644 src/components/SignupEmailContentWidget.tsx diff --git a/package-lock.json b/package-lock.json index 81c92f1..d41c72d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3310,8 +3310,7 @@ "bail": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.4.tgz", - "integrity": "sha512-S8vuDB4w6YpRhICUDET3guPlQpaJl7od94tpZ0Fvnyp+MKW/HyDTcRDck+29C9g+d/qQHnddRH3+94kZdrW0Ww==", - "dev": true + "integrity": "sha512-S8vuDB4w6YpRhICUDET3guPlQpaJl7od94tpZ0Fvnyp+MKW/HyDTcRDck+29C9g+d/qQHnddRH3+94kZdrW0Ww==" }, "balanced-match": { "version": "1.0.0", @@ -4547,8 +4546,7 @@ "character-entities": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.3.tgz", - "integrity": "sha512-yB4oYSAa9yLcGyTbB4ItFwHw43QHdH129IJ5R+WvxOkWlyFnR5FAaBNnUq4mcxsTVZGh28bHoeTHMKXH1wZf3w==", - "dev": true + "integrity": "sha512-yB4oYSAa9yLcGyTbB4ItFwHw43QHdH129IJ5R+WvxOkWlyFnR5FAaBNnUq4mcxsTVZGh28bHoeTHMKXH1wZf3w==" }, "character-entities-html4": { "version": "1.1.3", @@ -4559,14 +4557,12 @@ "character-entities-legacy": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.3.tgz", - "integrity": "sha512-YAxUpPoPwxYFsslbdKkhrGnXAtXoHNgYjlBM3WMXkWGTl5RsY3QmOyhwAgL8Nxm9l5LBThXGawxKPn68y6/fww==", - "dev": true + "integrity": "sha512-YAxUpPoPwxYFsslbdKkhrGnXAtXoHNgYjlBM3WMXkWGTl5RsY3QmOyhwAgL8Nxm9l5LBThXGawxKPn68y6/fww==" }, "character-reference-invalid": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.3.tgz", - "integrity": "sha512-VOq6PRzQBam/8Jm6XBGk2fNEnHXAdGd6go0rtd4weAGECBamHDwwCQSOT12TACIYUZegUXnV6xBXqUssijtxIg==", - "dev": true + "integrity": "sha512-VOq6PRzQBam/8Jm6XBGk2fNEnHXAdGd6go0rtd4weAGECBamHDwwCQSOT12TACIYUZegUXnV6xBXqUssijtxIg==" }, "chardet": { "version": "0.7.0", @@ -4946,8 +4942,7 @@ "collapse-white-space": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.5.tgz", - "integrity": "sha512-703bOOmytCYAX9cXYqoikYIx6twmFCXsnzRQheBcTG3nzKYBR4P/+wkYeH+Mvj7qUz8zZDtdyzbxfnEi/kYzRQ==", - "dev": true + "integrity": "sha512-703bOOmytCYAX9cXYqoikYIx6twmFCXsnzRQheBcTG3nzKYBR4P/+wkYeH+Mvj7qUz8zZDtdyzbxfnEi/kYzRQ==" }, "collection-visit": { "version": "1.0.0", @@ -7776,8 +7771,7 @@ "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extend-shallow": { "version": "3.0.2", @@ -9925,6 +9919,68 @@ "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", "dev": true }, + "html-to-react": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/html-to-react/-/html-to-react-1.4.4.tgz", + "integrity": "sha512-oE4GYH8c/gvFQwfNHBhg1LpfiPsQRKj0JQmvccvUHqyyF7U1H7UzZ7Z6CyF7okv1QFukyvjH9aAApNa4kYSO9g==", + "requires": { + "domhandler": "^3.3.0", + "htmlparser2": "^5.0", + "lodash.camelcase": "^4.3.0", + "ramda": "^0.27.1" + }, + "dependencies": { + "dom-serializer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.1.0.tgz", + "integrity": "sha512-ox7bvGXt2n+uLWtCRLybYx60IrOlWL/aCebWJk1T0d4m3y2tzf4U3ij9wBMUb6YJZpz06HCCYuyCDveE2xXmzQ==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz", + "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==" + }, + "domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "requires": { + "domelementtype": "^2.0.1" + } + }, + "domutils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.4.2.tgz", + "integrity": "sha512-NKbgaM8ZJOecTZsIzW5gSuplsX2IWW2mIK7xVr8hTQF2v1CJWTmLZ1HOCh5sH+IzVPAGE5IucooOkvwBRAdowA==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.0.1", + "domhandler": "^3.3.0" + } + }, + "entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" + }, + "htmlparser2": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-5.0.0.tgz", + "integrity": "sha512-/Cvz5RTj9q71kCL9No1u2jhFaAdoMtxpNy0YTwjmQB3iX2TZXfCojTm7tp3rM4NxcwaX1iAzvNgo8OFectXmrQ==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^3.3.0", + "domutils": "^2.4.2", + "entities": "^2.0.0" + } + } + } + }, "html-webpack-plugin": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", @@ -10753,8 +10809,7 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.5", @@ -10912,8 +10967,7 @@ "is-alphabetical": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.3.tgz", - "integrity": "sha512-eEMa6MKpHFzw38eKm56iNNi6GJ7lf6aLLio7Kr23sJPAECscgRtZvOBYybejWDQ2bM949Y++61PY+udzj5QMLA==", - "dev": true + "integrity": "sha512-eEMa6MKpHFzw38eKm56iNNi6GJ7lf6aLLio7Kr23sJPAECscgRtZvOBYybejWDQ2bM949Y++61PY+udzj5QMLA==" }, "is-alphanumeric": { "version": "1.0.0", @@ -10925,7 +10979,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.3.tgz", "integrity": "sha512-A1IGAPO5AW9vSh7omxIlOGwIqEvpW/TA+DksVOPM5ODuxKlZS09+TEM1E3275lJqO2oJ38vDpeAL3DCIiHE6eA==", - "dev": true, "requires": { "is-alphabetical": "^1.0.0", "is-decimal": "^1.0.0" @@ -10955,8 +11008,7 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-builtin-module": { "version": "1.0.0", @@ -11030,8 +11082,7 @@ "is-decimal": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.3.tgz", - "integrity": "sha512-bvLSwoDg2q6Gf+E2LEPiklHZxxiSi3XAh4Mav65mKqTfCO1HM3uBs24TjEH8iJX3bbDdLXKJXBTmGzuTUuAEjQ==", - "dev": true + "integrity": "sha512-bvLSwoDg2q6Gf+E2LEPiklHZxxiSi3XAh4Mav65mKqTfCO1HM3uBs24TjEH8iJX3bbDdLXKJXBTmGzuTUuAEjQ==" }, "is-descriptor": { "version": "0.1.6", @@ -11151,8 +11202,7 @@ "is-hexadecimal": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.3.tgz", - "integrity": "sha512-zxQ9//Q3D/34poZf8fiy3m3XVpbQc7ren15iKqrTtLPwkPD/t3Scy9Imp63FujULGxuK0ZlCwoo5xNpktFgbOA==", - "dev": true + "integrity": "sha512-zxQ9//Q3D/34poZf8fiy3m3XVpbQc7ren15iKqrTtLPwkPD/t3Scy9Imp63FujULGxuK0ZlCwoo5xNpktFgbOA==" }, "is-installed-globally": { "version": "0.3.2", @@ -11284,8 +11334,7 @@ "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" }, "is-plain-object": { "version": "2.0.4", @@ -11409,8 +11458,7 @@ "is-whitespace-character": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.3.tgz", - "integrity": "sha512-SNPgMLz9JzPccD3nPctcj8sZlX9DAMJSKH8bP7Z6bohCwuNgX8xbWr1eTAYXX9Vpi/aSn8Y1akL9WgM3t43YNQ==", - "dev": true + "integrity": "sha512-SNPgMLz9JzPccD3nPctcj8sZlX9DAMJSKH8bP7Z6bohCwuNgX8xbWr1eTAYXX9Vpi/aSn8Y1akL9WgM3t43YNQ==" }, "is-windows": { "version": "1.0.2", @@ -11421,8 +11469,7 @@ "is-word-character": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.3.tgz", - "integrity": "sha512-0wfcrFgOOOBdgRNT9H33xe6Zi6yhX/uoc4U8NBZGeQQB0ctU1dnlNTyL9JM2646bHDTpsDm1Brb3VPoCIMrd/A==", - "dev": true + "integrity": "sha512-0wfcrFgOOOBdgRNT9H33xe6Zi6yhX/uoc4U8NBZGeQQB0ctU1dnlNTyL9JM2646bHDTpsDm1Brb3VPoCIMrd/A==" }, "is-wsl": { "version": "1.1.0", @@ -12067,6 +12114,11 @@ "integrity": "sha1-uvSJNOVDobXWNG+MhGmLGoyAOJY=", "dev": true }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, "lodash.defaultsdeep": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", @@ -12309,8 +12361,7 @@ "markdown-escapes": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.3.tgz", - "integrity": "sha512-XUi5HJhhV5R74k8/0H2oCbCiYf/u4cO/rX8tnGkRvrqhsr5BRNU6Mg0yt/8UIx1iIS8220BNJsDb7XnILhLepw==", - "dev": true + "integrity": "sha512-XUi5HJhhV5R74k8/0H2oCbCiYf/u4cO/rX8tnGkRvrqhsr5BRNU6Mg0yt/8UIx1iIS8220BNJsDb7XnILhLepw==" }, "markdown-table": { "version": "1.1.3", @@ -12351,6 +12402,21 @@ "safe-buffer": "^5.1.2" } }, + "mdast-add-list-metadata": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdast-add-list-metadata/-/mdast-add-list-metadata-1.0.1.tgz", + "integrity": "sha512-fB/VP4MJ0LaRsog7hGPxgOrSL3gE/2uEdZyDuSEnKCv/8IkYHiDkIQSbChiJoHyxZZXZ9bzckyRk+vNxFzh8rA==", + "requires": { + "unist-util-visit-parents": "1.1.2" + }, + "dependencies": { + "unist-util-visit-parents": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz", + "integrity": "sha512-yvo+MMLjEwdc3RhhPYSximset7rwjMrdt9E41Smmvg25UQIenzrN83cRnF1JMzoMi9zZOQeYXHSDf7p+IQkW3Q==" + } + } + }, "mdast-util-compact": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.3.tgz", @@ -14133,7 +14199,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", - "dev": true, "requires": { "character-entities": "^1.0.0", "character-entities-legacy": "^1.0.0", @@ -15177,6 +15242,11 @@ "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.0.tgz", "integrity": "sha512-m7zq0JkIrECzw9mO5Zcq6jN4KayE34yoIS9hJoiZNXyOAT06PPA8PrR+WtJIeFW09YjUfNkMMN9lrmAt6BURCA==" }, + "ramda": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", + "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==" + }, "randomatic": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", @@ -15447,6 +15517,110 @@ "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, + "react-markdown": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-4.3.1.tgz", + "integrity": "sha512-HQlWFTbDxTtNY6bjgp3C3uv1h2xcjCSi1zAEzfBW9OwJJvENSYiLXWNXN5hHLsoqai7RnZiiHzcnWdXk2Splzw==", + "requires": { + "html-to-react": "^1.3.4", + "mdast-add-list-metadata": "1.0.1", + "prop-types": "^15.7.2", + "react-is": "^16.8.6", + "remark-parse": "^5.0.0", + "unified": "^6.1.5", + "unist-util-visit": "^1.3.0", + "xtend": "^4.0.1" + }, + "dependencies": { + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "remark-parse": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-5.0.0.tgz", + "integrity": "sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA==", + "requires": { + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^1.1.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^1.0.0", + "vfile-location": "^2.0.0", + "xtend": "^4.0.1" + } + }, + "unified": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz", + "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^1.1.0", + "trough": "^1.0.0", + "vfile": "^2.0.0", + "x-is-string": "^0.1.0" + } + }, + "unist-util-stringify-position": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", + "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" + }, + "vfile": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz", + "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==", + "requires": { + "is-buffer": "^1.1.4", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "^1.0.0", + "vfile-message": "^1.0.0" + } + }, + "vfile-message": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", + "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", + "requires": { + "unist-util-stringify-position": "^1.1.1" + } + } + } + }, + "react-mde": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/react-mde/-/react-mde-11.0.0.tgz", + "integrity": "sha512-U3k/ITPXklEjXkKhR7rgI3Y7ii5V62slSmG+/rYDQaCAabNwX+5dULKpIxWWSyqi+PvsuRVEYx6vV4sECMMbCw==" + }, "react-redux": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.1.1.tgz", @@ -16022,8 +16196,7 @@ "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, "repeating": { "version": "2.0.1", @@ -16037,8 +16210,7 @@ "replace-ext": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" }, "replicator": { "version": "1.0.3", @@ -17651,8 +17823,7 @@ "state-toggle": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.2.tgz", - "integrity": "sha512-8LpelPGR0qQM4PnfLiplOQNJcIN1/r2Gy0xKB2zKnIW2YzPMt2sR4I/+gtPjhN7Svh9kw+zqEg2SFwpBO9iNiw==", - "dev": true + "integrity": "sha512-8LpelPGR0qQM4PnfLiplOQNJcIN1/r2Gy0xKB2zKnIW2YzPMt2sR4I/+gtPjhN7Svh9kw+zqEg2SFwpBO9iNiw==" }, "static-extend": { "version": "0.1.2", @@ -20240,8 +20411,7 @@ "trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", - "dev": true + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" }, "trim-newlines": { "version": "1.0.0", @@ -20269,14 +20439,12 @@ "trim-trailing-lines": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.2.tgz", - "integrity": "sha512-MUjYItdrqqj2zpcHFTkMa9WAv4JHTI6gnRQGPFLrt5L9a6tRMiDnIqYl8JBvu2d2Tc3lWJKQwlGCp0K8AvCM+Q==", - "dev": true + "integrity": "sha512-MUjYItdrqqj2zpcHFTkMa9WAv4JHTI6gnRQGPFLrt5L9a6tRMiDnIqYl8JBvu2d2Tc3lWJKQwlGCp0K8AvCM+Q==" }, "trough": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.4.tgz", - "integrity": "sha512-tdzBRDGWcI1OpPVmChbdSKhvSVurznZ8X36AYURAcl+0o2ldlCY2XPzyXNNxwJwwyIU+rIglTCG4kxtNKBQH7Q==", - "dev": true + "integrity": "sha512-tdzBRDGWcI1OpPVmChbdSKhvSVurznZ8X36AYURAcl+0o2ldlCY2XPzyXNNxwJwwyIU+rIglTCG4kxtNKBQH7Q==" }, "truncate-utf8-bytes": { "version": "1.0.2", @@ -20588,7 +20756,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.2.tgz", "integrity": "sha512-W3tMnpaMG7ZY6xe/moK04U9fBhi6wEiCYHUW5Mop/wQHf12+79EQGwxYejNdhEz2mkqkBlGwm7pxmgBKMVUj0w==", - "dev": true, "requires": { "inherits": "^2.0.1", "xtend": "^4.0.1" @@ -20667,14 +20834,12 @@ "unist-util-is": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==", - "dev": true + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" }, "unist-util-remove-position": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.3.tgz", "integrity": "sha512-CtszTlOjP2sBGYc2zcKA/CvNdTdEs3ozbiJ63IPBxh8iZg42SCCb8m04f8z2+V1aSk5a7BxbZKEdoDjadmBkWA==", - "dev": true, "requires": { "unist-util-visit": "^1.1.0" } @@ -20692,7 +20857,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "dev": true, "requires": { "unist-util-visit-parents": "^2.0.0" } @@ -20701,7 +20865,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "dev": true, "requires": { "unist-util-is": "^3.0.0" } @@ -21141,8 +21304,7 @@ "vfile-location": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.5.tgz", - "integrity": "sha512-Pa1ey0OzYBkLPxPZI3d9E+S4BmvfVwNAAXrrqGbwTVXWaX2p9kM1zZ+n35UtVM06shmWKH4RPRN8KI80qE3wNQ==", - "dev": true + "integrity": "sha512-Pa1ey0OzYBkLPxPZI3d9E+S4BmvfVwNAAXrrqGbwTVXWaX2p9kM1zZ+n35UtVM06shmWKH4RPRN8KI80qE3wNQ==" }, "vfile-message": { "version": "2.0.1", @@ -22777,8 +22939,7 @@ "x-is-string": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", - "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=", - "dev": true + "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=" }, "x-xss-protection": { "version": "1.3.0", @@ -22830,8 +22991,7 @@ "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, "y18n": { "version": "4.0.0", diff --git a/package.json b/package.json index 8788596..acb5ca6 100644 --- a/package.json +++ b/package.json @@ -132,6 +132,8 @@ "react-beautiful-dnd": "10.1.1", "react-helmet": "5.2.1", "react-jsonschema-form": "^1.8.1", + "react-markdown": "4.3.1", + "react-mde": "11.0.0", "react-router-dom": "4.3.1", "react-router-hash-link": "1.2.1", "shortid": "2.2.14", diff --git a/src/components/SignupEmailContentWidget.tsx b/src/components/SignupEmailContentWidget.tsx new file mode 100644 index 0000000..e2ba364 --- /dev/null +++ b/src/components/SignupEmailContentWidget.tsx @@ -0,0 +1,38 @@ +import React from "react"; +import styled from "styled-components"; +import ReactMde from "react-mde"; +import "react-mde/lib/styles/css/react-mde-all.css"; +import ReactMarkdown from "react-markdown"; +import { WidgetProps } from "react-jsonschema-form"; + +type SignupEmailContentWidgetProps = Omit & { + options: any; +}; + +const Container = styled.div` + background: white; + color: black; + + button { + color: black; + } +`; + +const SignupEmailContentWidget: React.FC = ({ value, onChange }) => { + const [selectedTab, setSelectedTab] = React.useState<"write" | "preview">("write"); + return ( + + + Promise.resolve() + } + /> + + ) +} + +export default SignupEmailContentWidget; diff --git a/src/pages/admin/SignupCreatePage.tsx b/src/pages/admin/SignupCreatePage.tsx index 0dab641..effa3a8 100644 --- a/src/pages/admin/SignupCreatePage.tsx +++ b/src/pages/admin/SignupCreatePage.tsx @@ -6,13 +6,19 @@ import Form from "react-jsonschema-form"; import { createForm, getForm, updateForm, SignupForm } from "@models/SignupForm"; import DatetimeWidget from "@components/DatetimeWidget"; import SignupQuestionsWidget from "@components/SignupQuestionsWidget"; +import SignupEmailContentWidget from "@components/SignupEmailContentWidget"; import { buildValidationSchema } from "@views/SignUpPage/FormUtils"; const widgets = { datetime: DatetimeWidget, signup: SignupQuestionsWidget, + markdownEditor: SignupEmailContentWidget }; +const DEFAULT_EMAIL = +`Moikka, +Ilmottautuminen saapui perille.` +; export interface SignupCreatePageProps { history: { push: (to: string) => void; @@ -151,6 +157,11 @@ class SignupCreatePage extends React.Component { const uiSchema = { - content: { - "ui:widget": "textarea", + email_content: { + "ui:widget": "markdownEditor", }, start_time: { "ui:widget": "datetime", From d5158648bccc33a2a31b3c971b21621251ae6198 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Thu, 8 Oct 2020 18:37:14 +0300 Subject: [PATCH 02/78] Rename to MarkdownEditorWIdget & use for event content --- ...ignupEmailContentWidget.tsx => MarkdownEditorWidget.tsx} | 6 +++--- src/pages/admin/EventCreatePage.tsx | 6 ++++-- src/pages/admin/SignupCreatePage.tsx | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) rename src/components/{SignupEmailContentWidget.tsx => MarkdownEditorWidget.tsx} (78%) diff --git a/src/components/SignupEmailContentWidget.tsx b/src/components/MarkdownEditorWidget.tsx similarity index 78% rename from src/components/SignupEmailContentWidget.tsx rename to src/components/MarkdownEditorWidget.tsx index e2ba364..a40e8ac 100644 --- a/src/components/SignupEmailContentWidget.tsx +++ b/src/components/MarkdownEditorWidget.tsx @@ -5,7 +5,7 @@ import "react-mde/lib/styles/css/react-mde-all.css"; import ReactMarkdown from "react-markdown"; import { WidgetProps } from "react-jsonschema-form"; -type SignupEmailContentWidgetProps = Omit & { +type MarkdownEditorWidgetProps = Omit & { options: any; }; @@ -18,7 +18,7 @@ const Container = styled.div` } `; -const SignupEmailContentWidget: React.FC = ({ value, onChange }) => { +const MarkdownEditorWidget: React.FC = ({ value, onChange }) => { const [selectedTab, setSelectedTab] = React.useState<"write" | "preview">("write"); return ( @@ -35,4 +35,4 @@ const SignupEmailContentWidget: React.FC = ({ val ) } -export default SignupEmailContentWidget; +export default MarkdownEditorWidget; diff --git a/src/pages/admin/EventCreatePage.tsx b/src/pages/admin/EventCreatePage.tsx index e05d1ba..be0eda0 100644 --- a/src/pages/admin/EventCreatePage.tsx +++ b/src/pages/admin/EventCreatePage.tsx @@ -7,10 +7,12 @@ import { SignupForm, getForms } from "@models/SignupForm"; import { createEvent, getEvent, updateEvent, Event } from "@models/Event"; import DatetimeWidget from "@components/DatetimeWidget"; import SectionDividerWidget from "@components/SectionDividerWidget"; +import MarkdownEditorWidget from "@components/MarkdownEditorWidget"; const widgets = { datetime: DatetimeWidget, section_divider: SectionDividerWidget, + markdownEditor: MarkdownEditorWidget }; export interface EventCreatePageProps { @@ -262,10 +264,10 @@ class EventCreatePage extends React.Component { const uiSchema = { content_fi: { - "ui:widget": "textarea", + "ui:widget": "markdownEditor", }, content_en: { - "ui:widget": "textarea", + "ui:widget": "markdownEditor", }, start_time: { "ui:widget": "datetime", diff --git a/src/pages/admin/SignupCreatePage.tsx b/src/pages/admin/SignupCreatePage.tsx index effa3a8..f81df6d 100644 --- a/src/pages/admin/SignupCreatePage.tsx +++ b/src/pages/admin/SignupCreatePage.tsx @@ -6,13 +6,13 @@ import Form from "react-jsonschema-form"; import { createForm, getForm, updateForm, SignupForm } from "@models/SignupForm"; import DatetimeWidget from "@components/DatetimeWidget"; import SignupQuestionsWidget from "@components/SignupQuestionsWidget"; -import SignupEmailContentWidget from "@components/SignupEmailContentWidget"; +import MarkdownEditorWidget from "@components/MarkdownEditorWidget"; import { buildValidationSchema } from "@views/SignUpPage/FormUtils"; const widgets = { datetime: DatetimeWidget, signup: SignupQuestionsWidget, - markdownEditor: SignupEmailContentWidget + markdownEditor: MarkdownEditorWidget }; const DEFAULT_EMAIL = `Moikka, From da71a868226bfa1e7ece7d0e53078b748fbabcd0 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Thu, 8 Oct 2020 18:37:46 +0300 Subject: [PATCH 03/78] Use localized fields from be --- src/models/Event.ts | 2 ++ src/pages/admin/EventCreatePage.tsx | 17 +++++++++++------ src/pages/admin/SignupCreatePage.tsx | 11 ++++++++--- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/models/Event.ts b/src/models/Event.ts index 3ce1b27..fd951f2 100644 --- a/src/models/Event.ts +++ b/src/models/Event.ts @@ -13,6 +13,8 @@ export interface Event { description_en: string; content_fi: string; content_en: string; + location_fi: string; + location_en: string; start_time: string; end_time: string; image: string; diff --git a/src/pages/admin/EventCreatePage.tsx b/src/pages/admin/EventCreatePage.tsx index be0eda0..eecbd7e 100644 --- a/src/pages/admin/EventCreatePage.tsx +++ b/src/pages/admin/EventCreatePage.tsx @@ -168,7 +168,7 @@ class EventCreatePage extends React.Component Date: Thu, 8 Oct 2020 18:54:12 +0300 Subject: [PATCH 04/78] Rewrite AdminHeader --- src/components/AdminHeader/AdminHeader.scss | 32 ----------------- src/components/AdminHeader/AdminHeader.tsx | 39 ++++++++++++--------- 2 files changed, 23 insertions(+), 48 deletions(-) delete mode 100644 src/components/AdminHeader/AdminHeader.scss diff --git a/src/components/AdminHeader/AdminHeader.scss b/src/components/AdminHeader/AdminHeader.scss deleted file mode 100644 index a236b27..0000000 --- a/src/components/AdminHeader/AdminHeader.scss +++ /dev/null @@ -1,32 +0,0 @@ -@import "../../assets/scss/globals"; - -.admin-header { - margin-bottom: 0.5rem; - - .heading { - margin: 0 2rem; - font-weight: 500; - font-size: 24px; - - @media screen and (max-width: 600px - 1px) { - display: none; - } - } - - a { - max-width: 100%; - display: flex; - flex-flow: column nowrap; - align-items: center; - - img { - margin: 1rem 0.5rem; - - @media screen and (max-width: 600px - 1px) { - max-width: 300px !important; - width: 100%; - margin: 1rem auto; - } - } - } -} diff --git a/src/components/AdminHeader/AdminHeader.tsx b/src/components/AdminHeader/AdminHeader.tsx index c299094..3967cff 100644 --- a/src/components/AdminHeader/AdminHeader.tsx +++ b/src/components/AdminHeader/AdminHeader.tsx @@ -1,24 +1,31 @@ import React from "react"; +import styled from "styled-components"; import { Link } from "react-router-dom"; import TitleImage from "@assets/img/SIK_RGB_W_side.png"; -import "./AdminHeader.scss"; -export interface AdminHeaderProps { } -export interface AdminHeaderState { } +const Header = styled.header` + margin: 0.5rem; -class AdminHeader extends React.Component { - render() { - return ( - -
- - - -
Admin panel
-
-
- ); + a { + max-width: 100%; + display: flex; + flex-flow: column nowrap; + align-items: center; + + img { + padding: 2rem; + width: 100%; + max-width: 800px; + } } -} +`; + +const AdminHeader: React.FC = () => ( +
+ + + +
+); export default AdminHeader; From 09b85067b05b2a2b597f11c21acb4fcd6c8a6993 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Thu, 8 Oct 2020 18:54:54 +0300 Subject: [PATCH 05/78] SignupForm localised title --- src/models/SignupForm.ts | 3 ++- src/pages/admin/AdminCommonPage.tsx | 4 ++-- src/pages/admin/AdminSignupPage.tsx | 2 +- src/pages/admin/EventCreatePage.tsx | 2 +- src/views/EventPage/EventPageView.tsx | 2 +- src/views/SignUpPage/FormUtils.tsx | 2 +- src/views/SignUpPage/SignUpPageView.tsx | 2 +- 7 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/models/SignupForm.ts b/src/models/SignupForm.ts index 750f751..47667a2 100644 --- a/src/models/SignupForm.ts +++ b/src/models/SignupForm.ts @@ -5,7 +5,8 @@ import { Question } from "@components/SignupQuestionsWidget"; export interface SignupForm { id?: number; - title: string; + title_fi: string; + title_en: string; visible: boolean; start_time: string; end_time: string; diff --git a/src/pages/admin/AdminCommonPage.tsx b/src/pages/admin/AdminCommonPage.tsx index cadfa76..6671c1b 100644 --- a/src/pages/admin/AdminCommonPage.tsx +++ b/src/pages/admin/AdminCommonPage.tsx @@ -54,13 +54,13 @@ class AdminCommonPage extends React.Component + <>
- + ); } } diff --git a/src/pages/admin/AdminSignupPage.tsx b/src/pages/admin/AdminSignupPage.tsx index 8fca13d..7051cbb 100644 --- a/src/pages/admin/AdminSignupPage.tsx +++ b/src/pages/admin/AdminSignupPage.tsx @@ -90,7 +90,7 @@ class AdminSignupPage extends React.Component {signupForms.map(signupForm => ( - {signupForm.title} + {signupForm.title_fi} {formatRelative(new Date(signupForm.start_time), new Date())} {formatRelative(new Date(signupForm.end_time), new Date())} diff --git a/src/pages/admin/EventCreatePage.tsx b/src/pages/admin/EventCreatePage.tsx index eecbd7e..009ccd4 100644 --- a/src/pages/admin/EventCreatePage.tsx +++ b/src/pages/admin/EventCreatePage.tsx @@ -203,7 +203,7 @@ class EventCreatePage extends React.Component form.id), - enumNames: signupForm.map(form => form.title), + enumNames: signupForm.map(form => form.title_fi), }, uniqueItems: true, }, diff --git a/src/views/EventPage/EventPageView.tsx b/src/views/EventPage/EventPageView.tsx index fe4cb4b..c0187e1 100644 --- a/src/views/EventPage/EventPageView.tsx +++ b/src/views/EventPage/EventPageView.tsx @@ -36,7 +36,7 @@ class EventPageView extends React.Component { {event.signupForm.map(sf => ( ) diff --git a/src/views/SignUpPage/FormUtils.tsx b/src/views/SignUpPage/FormUtils.tsx index 43c126b..e555ed2 100644 --- a/src/views/SignUpPage/FormUtils.tsx +++ b/src/views/SignUpPage/FormUtils.tsx @@ -119,7 +119,7 @@ export const buildFormSchema = (signUpForm: SignupForm) => { }); const schema = { - title: signUpForm.id ? signUpForm.title : "Loading...", + title: signUpForm.id ? signUpForm.title_fi : "Loading...", type: "object", required: requiredIds, properties: schemaProps, diff --git a/src/views/SignUpPage/SignUpPageView.tsx b/src/views/SignUpPage/SignUpPageView.tsx index 92ea3e1..e6055bc 100644 --- a/src/views/SignUpPage/SignUpPageView.tsx +++ b/src/views/SignUpPage/SignUpPageView.tsx @@ -52,7 +52,7 @@ const SignUpPageView: React.FC = ({ return ( <>

- {signUpForm.title} + {signUpForm.title_fi}

Date: Thu, 8 Oct 2020 19:17:51 +0300 Subject: [PATCH 06/78] Fix .css import --- src/components/MarkdownEditorWidget.scss | 1 + src/components/MarkdownEditorWidget.tsx | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 src/components/MarkdownEditorWidget.scss diff --git a/src/components/MarkdownEditorWidget.scss b/src/components/MarkdownEditorWidget.scss new file mode 100644 index 0000000..b06144e --- /dev/null +++ b/src/components/MarkdownEditorWidget.scss @@ -0,0 +1 @@ +@import "~react-mde/lib/styles/css/react-mde-all.css"; \ No newline at end of file diff --git a/src/components/MarkdownEditorWidget.tsx b/src/components/MarkdownEditorWidget.tsx index a40e8ac..70ee954 100644 --- a/src/components/MarkdownEditorWidget.tsx +++ b/src/components/MarkdownEditorWidget.tsx @@ -1,9 +1,9 @@ import React from "react"; import styled from "styled-components"; import ReactMde from "react-mde"; -import "react-mde/lib/styles/css/react-mde-all.css"; import ReactMarkdown from "react-markdown"; import { WidgetProps } from "react-jsonschema-form"; +import "./MarkdownEditorWidget.scss" type MarkdownEditorWidgetProps = Omit & { options: any; From 0e1896817851792e0841a467c9266b0baf313437 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Thu, 8 Oct 2020 19:31:04 +0300 Subject: [PATCH 07/78] Fix E2E test --- tests/testcafe/admin.test.ts | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/tests/testcafe/admin.test.ts b/tests/testcafe/admin.test.ts index 60eb1fd..6f1e05f 100644 --- a/tests/testcafe/admin.test.ts +++ b/tests/testcafe/admin.test.ts @@ -5,17 +5,6 @@ */ import { Selector, ClientFunction } from "testcafe"; -fixture`Admin page renders and functions correctly`.page("http://localhost:3000/admin"); - -test("Header contains text \"Admin panel\"", async t => { - /** - * Test if the header contains the text. - */ - const header = Selector(".heading"); - await t.expect(header.textContent) - .contains("Admin panel"); -}); - fixture`Admin login page functions correctly`.page("http://localhost:3000/admin/login"); test("Login form exists", async t => { From 1b6bee549386aefa07488f7a6a301e8f0f8265a7 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Thu, 8 Oct 2020 20:19:43 +0300 Subject: [PATCH 08/78] Use ReactMarkdown on Event content --- src/theme/colors.ts | 15 ++++ src/views/EventPage/EventPage.scss | 31 ------- src/views/EventPage/EventPageView.tsx | 125 ++++++++++++++++++-------- 3 files changed, 104 insertions(+), 67 deletions(-) delete mode 100644 src/views/EventPage/EventPage.scss diff --git a/src/theme/colors.ts b/src/theme/colors.ts index a949fe9..5ccd7c8 100644 --- a/src/theme/colors.ts +++ b/src/theme/colors.ts @@ -19,3 +19,18 @@ export const colorToClass = (color: Colors): string => color ? `color-div__${col export const bgColorToClass = (color: Colors): string => color ? `color-div__background_${color}` : undefined; export const hoverColorToClass = (color: Colors): string => color ? `color-div__${color}Hoverable` : undefined; export const bgHoverColorToClass = (color: Colors): string => color ? `color-div__background_${color}Hoverable` : undefined; + +export const colors = { + darkBlue: "#002d3a", + lightBlue: "#bfdbd9", + white: "#fff", + black: "#000", + grey1: "#d4d0c7", + grey2: "#efece4", + orange1: "#d57a2d", + orange2: "#dd934e", + blue1: "#57b2df", + lightTurquoise: "#beddeb", + green1: "#c0dcd9", + sand: "#fdf9d7" +} \ No newline at end of file diff --git a/src/views/EventPage/EventPage.scss b/src/views/EventPage/EventPage.scss deleted file mode 100644 index c46c96b..0000000 --- a/src/views/EventPage/EventPage.scss +++ /dev/null @@ -1,31 +0,0 @@ -@import "../../assets/scss/globals"; - -.event-view { - margin: auto; - max-width: 600px; - align-items: center; - - h1 { - color: color(dark-blue); - } -} - -.event-desc { - color: color(orange1); -} - -.event-content { - color: color(black1); -} - -.event-banner { - img { - width: 100%; - } -} - -.event-signup-buttons { - display: flex; - flex-flow: row wrap; - justify-content: center; -} \ No newline at end of file diff --git a/src/views/EventPage/EventPageView.tsx b/src/views/EventPage/EventPageView.tsx index c0187e1..0c7b439 100644 --- a/src/views/EventPage/EventPageView.tsx +++ b/src/views/EventPage/EventPageView.tsx @@ -1,5 +1,7 @@ import React from "react"; -import "./EventPage.scss"; +import styled from "styled-components"; +import ReactMarkdown from "react-markdown"; +import { colors } from "@theme/colors"; import { Event } from "@models/Event"; import Button from "@components/Button"; import Anchor from "@components/Anchor"; @@ -10,42 +12,93 @@ interface EventPageViewProps { event?: Event; } +const StyledSection = styled(MainSection)` + margin: auto; + max-width: 1000px; + align-items: center; -class EventPageView extends React.Component { - render() { - const { event } = this.props; - if (!event) return
Loading
- - return ( - - -
- {event.title_fi} -
-

- {event.title_fi} -

-

- {event.description_fi} -

-

- {event.content_fi} -

- {/* We may have multiple signup forms. Generate own Button for each one */} -
- {event.signupForm.map(sf => ( - - - - ) - )} -
-
-
- ); + h1 { + color: ${colors.darkBlue}; } -} + img { + width: 100%; + min-height: 100px; + } + + .event-desc { + color: ${colors.orange1}; + } + + .event-signup-buttons { + display: flex; + flex-flow: row wrap; + justify-content: center; + } +`; + +const Content = styled.div` + p { + color: ${colors.black}; + } + + h1, h3 { + color: ${colors.orange2}; + } + + a { + color: ${colors.blue1}; + + &:hover { + color: ${colors.lightBlue}; + } + } + + table { + tr { + vertical-align: top; + + td { + word-break: break-word; + padding: 8px; + } + + td:first-of-type { + word-break: unset; + padding-left: 0; + } + } + } +`; + +const EventPageView: React.FC = ({ event }) => { + if (!event) return
Loading
+ return ( + + +

+ {event.title_fi} +

+

+ {event.description_fi} +

+ {event.title_fi} + + + + {/* We may have multiple signup forms. Generate own Button for each one */} +
+ {event.signupForm.map(sf => ( + + + + ) + )} +
+
+
+ ); +} export default EventPageView; From 8e883d7eacf8ef9e680ab008acf2c1470de42d38 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Thu, 8 Oct 2020 23:33:51 +0300 Subject: [PATCH 09/78] All sorts of BS --- src/components/Anchor.tsx | 25 +++++++ src/components/Anchor/Anchor.tsx | 29 -------- src/components/Anchor/index.ts | 2 - src/components/AsideSection/AsideSection.scss | 10 --- src/components/AsideSection/AsideSection.tsx | 46 +++++++------ src/components/Checkbox/Checkbox.tsx | 5 +- src/components/ColorDiv/ColorDiv.scss | 66 ------------------- src/components/ColorDiv/ColorDiv.tsx | 50 +++++++------- src/components/Hero/HeroAsideItem.tsx | 56 ++++++++++++++++ .../Hero/HeroAsideItem/HeroAsideItem.scss | 36 ---------- .../Hero/HeroAsideItem/HeroAsideItem.tsx | 21 ------ src/components/Hero/HeroAsideSection.tsx | 53 +++++++++++++++ .../HeroAsideSection/HeroAsideSection.scss | 43 ------------ .../HeroAsideSection/HeroAsideSection.tsx | 22 ------- .../{HeroMainSection => }/HeroMainSection.tsx | 0 .../HeroSecondarySection.tsx | 2 +- src/components/MainSection.tsx | 30 +++++++++ src/components/MainSection/MainSection.scss | 21 ------ src/components/MainSection/MainSection.tsx | 25 ------- src/components/MainSection/index.ts | 2 - src/components/PageSection/PageSection.scss | 40 ----------- src/components/PageSection/PageSection.tsx | 60 ++++++++++------- src/components/Ribbon/Ribbon.scss | 24 ------- src/components/Ribbon/Ribbon.tsx | 41 ++++++++---- src/components/TextAnchor.tsx | 30 +++++++++ src/components/TextAnchor/TextAnchor.scss | 18 ----- src/components/TextAnchor/TextAnchor.tsx | 49 -------------- src/components/TextAnchor/index.ts | 2 - src/theme/colors.ts | 32 +++++++-- src/views/ActualPage/ActualPageView.tsx | 20 +++--- src/views/ContactsPage/ContactsPageView.tsx | 2 +- src/views/CorporatePage/CorporatePageView.tsx | 18 ++--- src/views/EventPage/EventPageView.tsx | 32 +++++---- src/views/FreshmenPage/FreshmenPageView.tsx | 24 +++---- src/views/FrontPage/FrontPageView.tsx | 8 +-- src/views/GuildPage/GuildPageView.tsx | 8 +-- src/views/StudiesPage/StudiesPageView.tsx | 26 ++++---- 37 files changed, 414 insertions(+), 564 deletions(-) create mode 100644 src/components/Anchor.tsx delete mode 100644 src/components/Anchor/Anchor.tsx delete mode 100644 src/components/Anchor/index.ts delete mode 100644 src/components/AsideSection/AsideSection.scss delete mode 100644 src/components/ColorDiv/ColorDiv.scss create mode 100644 src/components/Hero/HeroAsideItem.tsx delete mode 100644 src/components/Hero/HeroAsideItem/HeroAsideItem.scss delete mode 100644 src/components/Hero/HeroAsideItem/HeroAsideItem.tsx create mode 100644 src/components/Hero/HeroAsideSection.tsx delete mode 100644 src/components/Hero/HeroAsideSection/HeroAsideSection.scss delete mode 100644 src/components/Hero/HeroAsideSection/HeroAsideSection.tsx rename src/components/Hero/{HeroMainSection => }/HeroMainSection.tsx (100%) rename src/components/Hero/{HeroSecondarySection => }/HeroSecondarySection.tsx (96%) create mode 100644 src/components/MainSection.tsx delete mode 100644 src/components/MainSection/MainSection.scss delete mode 100644 src/components/MainSection/MainSection.tsx delete mode 100644 src/components/MainSection/index.ts delete mode 100644 src/components/PageSection/PageSection.scss delete mode 100644 src/components/Ribbon/Ribbon.scss create mode 100644 src/components/TextAnchor.tsx delete mode 100644 src/components/TextAnchor/TextAnchor.scss delete mode 100644 src/components/TextAnchor/TextAnchor.tsx delete mode 100644 src/components/TextAnchor/index.ts diff --git a/src/components/Anchor.tsx b/src/components/Anchor.tsx new file mode 100644 index 0000000..e9ef6b4 --- /dev/null +++ b/src/components/Anchor.tsx @@ -0,0 +1,25 @@ +import React from "react"; +import { Link } from "react-router-dom"; +import { HashLink } from "react-router-hash-link"; + +interface AnchorProps extends React.HTMLAttributes { + to: string; +} + +const Anchor: React.FC = ({ to, ...props }) => { + if (to.startsWith("/")) { + return ( + + ); + } else if (to.startsWith("#")) { + return ( + + ); + } + else { + return ( + + ); + } +} +export default Anchor; diff --git a/src/components/Anchor/Anchor.tsx b/src/components/Anchor/Anchor.tsx deleted file mode 100644 index 8e86b53..0000000 --- a/src/components/Anchor/Anchor.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import React from "react"; -import { Link } from "react-router-dom"; -import { HashLink } from "react-router-hash-link"; - -export interface AnchorProps extends React.HTMLAttributes { - to: string; -} - -class Anchor extends React.Component { - render() { - const { children, to, ...props } = this.props; - - if (to.startsWith("/")) { - return ( - {children} - ); - } else if (to.startsWith("#")) { - return ( - {children} - ); - } - else { - return ( - {children} - ); - } - } -} -export default Anchor; diff --git a/src/components/Anchor/index.ts b/src/components/Anchor/index.ts deleted file mode 100644 index dcc717e..0000000 --- a/src/components/Anchor/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -import Anchor from "./Anchor"; -export default Anchor; diff --git a/src/components/AsideSection/AsideSection.scss b/src/components/AsideSection/AsideSection.scss deleted file mode 100644 index 80f731a..0000000 --- a/src/components/AsideSection/AsideSection.scss +++ /dev/null @@ -1,10 +0,0 @@ -@import "../../assets/scss/globals"; - - -.aside-section { - display: flex; - flex: 1; - flex-flow: column; - justify-content: space-between; - padding: 3rem 4rem; -} diff --git a/src/components/AsideSection/AsideSection.tsx b/src/components/AsideSection/AsideSection.tsx index 9dce772..035a961 100644 --- a/src/components/AsideSection/AsideSection.tsx +++ b/src/components/AsideSection/AsideSection.tsx @@ -1,25 +1,33 @@ import React from "react"; -import "./AsideSection.scss"; -import ColorDiv, { ColorDivProps } from "../ColorDiv/ColorDiv"; +import styled from "styled-components"; +import { ColorDivProps } from "../ColorDiv/ColorDiv"; +import { ColorMapper } from "@theme/colors"; -export interface AsideSectionProps { - className?: string; -} -export interface AsideSectionState { } +type AsideSectionProps = ColorDivProps; -class AsideSection extends React.Component { - render() { - const { children, className, ...props } = this.props; - const classNames = [ - "aside-section", - ]; - if (className) classNames.push(className); - return ( - - {children} - - ); +const Section = styled.div` + display: flex; + flex: 1; + flex-flow: column; + justify-content: space-between; + padding: 3rem 4rem; + + color: ${(p) => p.textColor}; + background-color: ${(p) => p.backgroundColor}; + &:hover { + color: ${(p) => p.hoverColor}; + background-color: ${(p) => p.hoverBackgroundColor}; } -} +`; + +const AsideSection: React.FC = ({ textColor, backgroundColor, hoverColor, backgroundHoverColor, ...props }) => ( +
+); export default AsideSection; diff --git a/src/components/Checkbox/Checkbox.tsx b/src/components/Checkbox/Checkbox.tsx index 451e962..d19589c 100644 --- a/src/components/Checkbox/Checkbox.tsx +++ b/src/components/Checkbox/Checkbox.tsx @@ -1,5 +1,6 @@ import React from "react"; import styled from "styled-components"; +import { colors } from "@theme/colors"; const Container = styled.label` display: block; @@ -31,7 +32,7 @@ const CustomCBoxElement = styled.span<{checked?: boolean}>` left: 0; height: 1em; width: 1em; - background-color: ${(props) => props.checked ? "#57b2df" : "#efece4"}; /* blue1 or grey2 */ + background-color: ${(props) => props.checked ? colors.blue1 : colors.grey2}; &:focus &:before { transition: box-shadow 150ms ease; @@ -43,7 +44,7 @@ const CustomCBoxElement = styled.span<{checked?: boolean}>` left: -4px; right: -4px; border-radius: 6px; - border: 2px solid color(blue); + border: 2px solid ${colors.blue1}; } `; diff --git a/src/components/ColorDiv/ColorDiv.scss b/src/components/ColorDiv/ColorDiv.scss deleted file mode 100644 index 4b4ee2d..0000000 --- a/src/components/ColorDiv/ColorDiv.scss +++ /dev/null @@ -1,66 +0,0 @@ -@import "../../assets/scss/globals"; - -.color-div { - @mixin hoverableColor($colorName) { - &__#{$colorName} { - color: color($colorName); - } - - &__#{$colorName}Hoverable { - &:hover, - &:active { - color: hover($colorName); - } - } - } - - @mixin backgroundColor($colorName) { - &__background_#{$colorName} { - background-color: color($colorName); - } - - &__background_#{$colorName}Hoverable { - &:hover, - &:active { - background-color: hover($colorName); - } - } - } - - @mixin backgroundAndHoverableColor($colorName) { - @include hoverableColor($colorName); - @include backgroundColor($colorName); - } - - @include backgroundAndHoverableColor(dark-blue); - @include backgroundAndHoverableColor(light-blue); - @include backgroundAndHoverableColor(white1); - @include backgroundAndHoverableColor(black1); - @include backgroundAndHoverableColor(grey1); - @include backgroundAndHoverableColor(grey2); - @include backgroundAndHoverableColor(orange1); - @include backgroundAndHoverableColor(orange2); - @include backgroundAndHoverableColor(blue1); - @include backgroundAndHoverableColor(light-turquoise); - @include backgroundAndHoverableColor(green1); - @include backgroundAndHoverableColor(sand); - - &__inherit { - color: inherit; - } - - &__transparent { - color: transparent; - } - - &__inheritHoverable { - &:hover, - &:active { - color: inherit; - } - } - - &__background_transparent { - background-color: transparent; - } -} \ No newline at end of file diff --git a/src/components/ColorDiv/ColorDiv.tsx b/src/components/ColorDiv/ColorDiv.tsx index 05a9b1c..754495b 100644 --- a/src/components/ColorDiv/ColorDiv.tsx +++ b/src/components/ColorDiv/ColorDiv.tsx @@ -1,34 +1,38 @@ import React from "react"; -import "./ColorDiv.scss"; -import { Colors, colorToClass, bgColorToClass, hoverColorToClass, bgHoverColorToClass } from "@theme/colors"; -import classNames from "classnames"; +import styled from "styled-components" +import { Colors, ColorMapper } from "@theme/colors"; -export interface ColorDivProps extends React.HTMLAttributes { +interface ColorsProps { + textColor?: string; + backgroundColor?: string; + hoverColor?: string; + hoverBackgroundColor?: string; +} + +export type ColorDivProps = React.HTMLAttributes & { textColor?: Colors; backgroundColor?: Colors; hoverColor?: Colors; backgroundHoverColor?: Colors; } -export interface ColorDivState { } - -class ColorDiv extends React.Component { - render() { - const { children, className, textColor, backgroundColor, hoverColor, backgroundHoverColor, ...props } = this.props; - const classes = classNames( - className, - colorToClass(textColor), - bgColorToClass(backgroundColor), - hoverColorToClass(hoverColor), - bgHoverColorToClass(backgroundHoverColor) - ); - - return ( -
- {children} -
- ); +const Div = styled.div` + color: ${(p) => p.textColor}; + background-color: ${(p) => p.backgroundColor}; + &:hover { + color: ${(p) => p.hoverColor}; + background-color: ${(p) => p.hoverBackgroundColor}; } -} +`; + +const ColorDiv: React.FC = ({ textColor, backgroundColor, hoverColor, backgroundHoverColor, ...props }) => ( +
+); export default ColorDiv; diff --git a/src/components/Hero/HeroAsideItem.tsx b/src/components/Hero/HeroAsideItem.tsx new file mode 100644 index 0000000..45189bb --- /dev/null +++ b/src/components/Hero/HeroAsideItem.tsx @@ -0,0 +1,56 @@ +import React from "react"; +import styled from "styled-components"; +import Anchor from "../Anchor"; +import { colors } from "@theme/colors"; + +interface HeroAsideItemProps { + title: string; + linkText: string; + linkHref: string; +} + +const Section = styled.div` + max-width: 300px; + line-height: 16px; + margin-bottom: 1rem; + + @media screen and (max-width: 600px - 1px) { + p, + a { + font-size: 16px !important; + line-height: 20px; + } + } + + h2 { + text-transform: uppercase; + letter-spacing: 3px; + line-height: 20px; + } + + p { + font-size: 14px; + line-height: 20px; + } + + h6 { + color: ${colors.blue1}; + font-weight: 600; + } + + h6:hover { + color: ${colors.white}; + } +`; + +const HeroAsideItem: React.FC = ({ title, linkText, linkHref, children }) => ( +
+

{title}

+

{children}

+ +
{linkText} ›
+
+
+) + +export default HeroAsideItem; diff --git a/src/components/Hero/HeroAsideItem/HeroAsideItem.scss b/src/components/Hero/HeroAsideItem/HeroAsideItem.scss deleted file mode 100644 index 4b4b047..0000000 --- a/src/components/Hero/HeroAsideItem/HeroAsideItem.scss +++ /dev/null @@ -1,36 +0,0 @@ -@import "../../../assets/scss/globals"; - - -.hero-aside-item { - max-width: 300px; - line-height: 16px; - margin-bottom: 1rem; - - @media screen and (max-width: 600px - 1px) { - p, - a { - font-size: 16px !important; - line-height: 20px; - } - } - - h2 { - text-transform: uppercase; - letter-spacing: 3px; - line-height: 20px; - } - - p { - font-size: 14px; - line-height: 20px; - } - - h6 { - color: color(blue1); - font-weight: 600; - } - - h6:hover { - color: color(white1); - } -} diff --git a/src/components/Hero/HeroAsideItem/HeroAsideItem.tsx b/src/components/Hero/HeroAsideItem/HeroAsideItem.tsx deleted file mode 100644 index a1143a9..0000000 --- a/src/components/Hero/HeroAsideItem/HeroAsideItem.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import React from "react"; -import "./HeroAsideItem.scss"; -import Anchor from "../../Anchor"; - -interface HeroAsideItemProps { - title: string; - linkText: string; - linkHref: string; -} - -const HeroAsideItem: React.FC = ({ title, linkText, linkHref, children }) => ( -
-

{title}

-

{children}

- -
{linkText} ›
-
-
-) - -export default HeroAsideItem; diff --git a/src/components/Hero/HeroAsideSection.tsx b/src/components/Hero/HeroAsideSection.tsx new file mode 100644 index 0000000..1081bb6 --- /dev/null +++ b/src/components/Hero/HeroAsideSection.tsx @@ -0,0 +1,53 @@ +import React from "react"; +import styled from "styled-components"; +import ColorDiv, { ColorDivProps } from "../ColorDiv/ColorDiv"; +import { colors } from "@theme/colors"; + +const Section = styled(ColorDiv)` + display: flex; + flex-flow: column nowrap; + align-items: flex-start; + justify-content: center; + flex: 4; + + @media screen and (max-width: 800px - 1px) { + align-items: center; + } + + text-align: left; + padding: 3rem 1rem 2rem; + + &.dark-blue { + background-color: ${colors.darkBlue}; + + h2 { + color: ${colors.lightBlue}; + } + + p { + font-weight: 100; + color: ${colors.white}; + } + } + + &.light-turquoise { + background-color: ${colors.lightTurquoise}; + + h2, + p { + color: ${colors.darkBlue}; + } + } + + &.light-blue { + background-color: ${colors.lightBlue}; + } +`; + +const HeroAsideSection: React.FC = (props) => { + return ( +
+ ); +} + +export default HeroAsideSection; diff --git a/src/components/Hero/HeroAsideSection/HeroAsideSection.scss b/src/components/Hero/HeroAsideSection/HeroAsideSection.scss deleted file mode 100644 index c632179..0000000 --- a/src/components/Hero/HeroAsideSection/HeroAsideSection.scss +++ /dev/null @@ -1,43 +0,0 @@ -@import "../../../assets/scss/globals"; - - -.hero-aside-section { - display: flex; - flex-flow: column nowrap; - align-items: flex-start; - justify-content: center; - flex: 4; - - @media screen and (max-width: 800px - 1px) { - align-items: center; - } - - text-align: left; - padding: 3rem 1rem 2rem; - - &.dark-blue { - background-color: color(dark-blue); - - h2 { - color: color(light-blue); - } - - p { - font-weight: 100; - color: color(white1); - } - } - - &.light-turquoise { - background-color: color(light-turquoise); - - h2, - p { - color: color(dark-blue); - } - } - - &.light-blue { - background-color: color(light-blue); - } -} diff --git a/src/components/Hero/HeroAsideSection/HeroAsideSection.tsx b/src/components/Hero/HeroAsideSection/HeroAsideSection.tsx deleted file mode 100644 index 505a0db..0000000 --- a/src/components/Hero/HeroAsideSection/HeroAsideSection.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import React from "react"; -import "./HeroAsideSection.scss"; -import ColorDiv, { ColorDivProps } from "../../ColorDiv/ColorDiv"; - - -export interface HeroAsideSectionProps { } -export interface HeroAsideSectionState { } - -class HeroAsideSection extends React.Component { - render() { - const className = "hero-aside-section"; - return ( - -
- {this.props.children} -
-
- ); - } -} - -export default HeroAsideSection; diff --git a/src/components/Hero/HeroMainSection/HeroMainSection.tsx b/src/components/Hero/HeroMainSection.tsx similarity index 100% rename from src/components/Hero/HeroMainSection/HeroMainSection.tsx rename to src/components/Hero/HeroMainSection.tsx diff --git a/src/components/Hero/HeroSecondarySection/HeroSecondarySection.tsx b/src/components/Hero/HeroSecondarySection.tsx similarity index 96% rename from src/components/Hero/HeroSecondarySection/HeroSecondarySection.tsx rename to src/components/Hero/HeroSecondarySection.tsx index a7234ee..ca170c4 100644 --- a/src/components/Hero/HeroSecondarySection/HeroSecondarySection.tsx +++ b/src/components/Hero/HeroSecondarySection.tsx @@ -1,6 +1,6 @@ import React from "react"; import styled from "styled-components"; -import ColorDiv from "../../ColorDiv/ColorDiv"; +import ColorDiv from "../ColorDiv/ColorDiv"; interface HeroSecondarySectionItemProps { note?: string; diff --git a/src/components/MainSection.tsx b/src/components/MainSection.tsx new file mode 100644 index 0000000..729717a --- /dev/null +++ b/src/components/MainSection.tsx @@ -0,0 +1,30 @@ +import React from "react"; +import styled from "styled-components"; +import ColorDiv, { ColorDivProps } from "./ColorDiv/ColorDiv"; +import { colors } from "@theme/colors"; + +const Section = styled(ColorDiv)` + display: flex; + flex: 2; + flex-flow: column; + padding: 0 3rem; + + & > h3 { + margin: auto; + } + + & > h6 { + color: ${colors.orange1}; + } + + & > p { + margin-block-start: 0.5rem; + margin-block-end: 1rem; + } +`; + +const MainSection: React.FC = (props) => ( +
+); + +export default MainSection; diff --git a/src/components/MainSection/MainSection.scss b/src/components/MainSection/MainSection.scss deleted file mode 100644 index ed09469..0000000 --- a/src/components/MainSection/MainSection.scss +++ /dev/null @@ -1,21 +0,0 @@ -@import "../../assets/scss/globals"; - -.main-section { - display: flex; - flex: 2; - flex-flow: column; - padding: 0 3rem; - - & > h3 { - margin: auto; - } - - & > h6 { - color: color(orange1); - } - - & > p { - margin-block-start: 0.5rem; - margin-block-end: 1rem; - } -} diff --git a/src/components/MainSection/MainSection.tsx b/src/components/MainSection/MainSection.tsx deleted file mode 100644 index a96a12a..0000000 --- a/src/components/MainSection/MainSection.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import React from "react"; -import "./MainSection.scss"; -import ColorDiv, { ColorDivProps } from "../ColorDiv/ColorDiv"; -import classNames from "classnames"; - -export interface MainSectionProps { } -export interface MainSectionState { } - -class MainSection extends React.Component { - render() { - const { children, className, ...props } = this.props; - const classes = classNames( - "main-section", - className - ); - - return ( - - {children} - - ); - } -} - -export default MainSection; diff --git a/src/components/MainSection/index.ts b/src/components/MainSection/index.ts deleted file mode 100644 index 50928f2..0000000 --- a/src/components/MainSection/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -import MainSection from "./MainSection"; -export default MainSection; diff --git a/src/components/PageSection/PageSection.scss b/src/components/PageSection/PageSection.scss deleted file mode 100644 index 99752d3..0000000 --- a/src/components/PageSection/PageSection.scss +++ /dev/null @@ -1,40 +0,0 @@ -@import "../../assets/scss/globals"; - - -.page-section { - display: flex; - flex-flow: row wrap; - justify-content: space-between; - position: relative; - - &.lander-hero { - @media screen and (min-width: 800px) { - min-height: 85vh; - } - } - - &.padded { - padding: 2rem 1rem 2rem; - } - - &:not(.card-section) { - @media screen and (max-width: 800px - 1px) { - flex-flow: column nowrap; - } - } - - &.center { - justify-content: center; - } - - &.bottom-border { - &::after { - content: ""; - position: absolute; - bottom: 0; - width: 98%; - left: 1%; - border-bottom: 1px solid rgba(color(blue1), 0.4); - } - } -} diff --git a/src/components/PageSection/PageSection.tsx b/src/components/PageSection/PageSection.tsx index e6e7c0b..baa9b6c 100644 --- a/src/components/PageSection/PageSection.tsx +++ b/src/components/PageSection/PageSection.tsx @@ -1,36 +1,50 @@ import React from "react"; -import "./PageSection.scss"; +import styled from "styled-components"; import ColorDiv, { ColorDivProps } from "../ColorDiv/ColorDiv"; +import { colors } from "@theme/colors"; -export interface PageSectionProps { +interface PageSectionProps { center?: boolean; bottomBorder?: boolean; cardSection?: boolean; // does section contain a grid of cards fullSize?: boolean; } -export interface PageSectionState { } -class PageSection extends React.Component { - render() { - const { children, className, center, bottomBorder, cardSection, fullSize, ...props } = this.props; - const centerClass = center ? "center" : ""; - const borderClass = bottomBorder ? "bottom-border" : ""; - const cardsClass = cardSection ? "card-section" : ""; - const nonPaddedClass = fullSize ? "" : "padded"; - const classNames = [ - "page-section", - centerClass, - borderClass, - cardsClass, - nonPaddedClass - ]; - if (className) classNames.push(className); - return ( - - {children} - - ); +const Section = styled(ColorDiv)` + display: flex; + flex-flow: row wrap; + justify-content: ${(p) => p.center ? "center" : "space-between"}; + position: relative; + padding: ${(p) => p.fullSize ? 0 : "2rem 1rem 2rem"}; + + .lander-hero { + @media screen and (min-width: 800px) { + min-height: 85vh; + } } + + ${(p) => p.cardSection ? "" : ` + @media screen and (max-width: 800px - 1px) { + flex-flow: column nowrap; + } + `} + + ${(p) => p.bottomBorder ? ` + &::after { + content: ""; + position: absolute; + bottom: 0; + width: 98%; + left: 1%; + border-bottom: 1px solid rgba(${colors.blue1}, 0.4); + } + ` : ""} +`; + +const PageSection: React.FC = (props) => { + return ( +
+ ); } export default PageSection; diff --git a/src/components/Ribbon/Ribbon.scss b/src/components/Ribbon/Ribbon.scss deleted file mode 100644 index f85144f..0000000 --- a/src/components/Ribbon/Ribbon.scss +++ /dev/null @@ -1,24 +0,0 @@ -@import "../../assets/scss/globals"; - - -.ribbon { - display: flex; - flex-flow: row nowrap; - align-items: flex-end; - text-align: center; - justify-content: center; - margin: auto; - - p { - font-size: 2rem; - font-weight: 100; - line-height: 30px; - margin-block-start: 0; - margin-block-end: 0; - } - - @media screen and (max-width: 600px - 1px) { - flex-flow: column nowrap; - align-items: center; - } -} diff --git a/src/components/Ribbon/Ribbon.tsx b/src/components/Ribbon/Ribbon.tsx index 240bb27..81f416b 100644 --- a/src/components/Ribbon/Ribbon.tsx +++ b/src/components/Ribbon/Ribbon.tsx @@ -1,17 +1,34 @@ -import React from "react"; -import "./Ribbon.scss"; +import styled from "styled-components"; -export interface RibbonProps {} -export interface RibbonState {} +const Ribbon = styled.div` + display: flex; + flex-flow: row nowrap; + align-items: flex-end; + text-align: center; + justify-content: center; + margin: auto; -class Ribbon extends React.Component { - render() { - return ( -
- {this.props.children} -
- ); + p { + font-size: 2rem; + font-weight: 100; + line-height: 30px; + margin-block-start: 0; + margin-block-end: 0; } -} + + a { + font-weight: 100; + text-decoration: none; + margin: 0 1rem; + font-size: 0.8rem; + text-transform: uppercase; + margin-top: 10px; + } + + @media screen and (max-width: 600px - 1px) { + flex-flow: column nowrap; + align-items: center; + } +`; export default Ribbon; diff --git a/src/components/TextAnchor.tsx b/src/components/TextAnchor.tsx new file mode 100644 index 0000000..99e608b --- /dev/null +++ b/src/components/TextAnchor.tsx @@ -0,0 +1,30 @@ +import React from "react"; +import styled from "styled-components"; +import { Colors, colorToClass, hoverColorToClass } from "@theme/colors"; +import Anchor from "./Anchor"; +import classNames from "classnames"; + +const A = styled(Anchor)` + text-decoration: underline; + font-weight: 600; +`; + +interface TextAnchorProps { + to: string; + textColor?: Colors; + hoverColor?: Colors; +} + +const TextAnchor: React.FC = ({ children, to, textColor, hoverColor }) => { + const classes = classNames( + colorToClass(textColor), + hoverColorToClass(hoverColor), + ) + return ( + + {children} + + ); +} + +export default TextAnchor; diff --git a/src/components/TextAnchor/TextAnchor.scss b/src/components/TextAnchor/TextAnchor.scss deleted file mode 100644 index ad1d68d..0000000 --- a/src/components/TextAnchor/TextAnchor.scss +++ /dev/null @@ -1,18 +0,0 @@ -@import "../../assets/scss/globals"; - -.text-anchor { - text-decoration: underline; - font-weight: 600; - - &__no-weight { - font-weight: 100; - } - - &__small { - text-decoration: none; - margin: 0 1rem; - font-size: 0.8rem; - text-transform: uppercase; - margin-top: 10px; - } -} diff --git a/src/components/TextAnchor/TextAnchor.tsx b/src/components/TextAnchor/TextAnchor.tsx deleted file mode 100644 index 193fab5..0000000 --- a/src/components/TextAnchor/TextAnchor.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import React from "react"; -import "./TextAnchor.scss"; -import { Colors, colorToClass, hoverColorToClass } from "@theme/colors"; -import Anchor from "../Anchor"; -import classNames from "classnames"; - - -export type TextSize = - "normal" | - "small" | - "large" | - "ribbon" | - "small-ribbon"; - - -const textSizeToClassName = new Map([ - ["normal", ""], - ["small", "text-anchor__small"], - ["large", "text-anchor__large"], - ["small-ribbon", "text-anchor__no-weight text-anchor__small"], - ["ribbon", "text-anchor__no-weight"], -]); - -export interface TextAnchorProps { - size?: TextSize; - to: string; - textColor?: Colors; - hoverColor?: Colors; -} -export interface TextAnchorState { } - -class TextAnchor extends React.Component { - render() { - const { children, size, to, textColor, hoverColor } = this.props; - const classes = classNames( - "text-anchor", - colorToClass(textColor), - hoverColorToClass(hoverColor), - textSizeToClassName.get(size) - ) - return ( - - {children} - - ); - } -} - -export default TextAnchor; diff --git a/src/components/TextAnchor/index.ts b/src/components/TextAnchor/index.ts deleted file mode 100644 index cf2f85a..0000000 --- a/src/components/TextAnchor/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -import TextAnchor from "./TextAnchor"; -export default TextAnchor; diff --git a/src/theme/colors.ts b/src/theme/colors.ts index 5ccd7c8..e467134 100644 --- a/src/theme/colors.ts +++ b/src/theme/colors.ts @@ -14,11 +14,22 @@ export type Colors = "transparent" | "inherit"; - -export const colorToClass = (color: Colors): string => color ? `color-div__${color}` : undefined; -export const bgColorToClass = (color: Colors): string => color ? `color-div__background_${color}` : undefined; -export const hoverColorToClass = (color: Colors): string => color ? `color-div__${color}Hoverable` : undefined; -export const bgHoverColorToClass = (color: Colors): string => color ? `color-div__background_${color}Hoverable` : undefined; +export const ColorMapper = new Map([ + ["dark-blue", "#002d3a"], + ["light-blue", "#bfdbd9"], + ["white1", "#fff"], + ["black1", "#000"], + ["grey1", "#d4d0c7"], + ["grey2", "#efece4"], + ["orange1", "#d57a2d"], + ["orange2", "#dd934e"], + ["blue1", "#57b2df"], + ["light-turquoise", "#beddeb"], + ["green1", "#c0dcd9"], + ["sand", "#fdf9d7"], + ["transparent", "transparent"], + ["inherit", "inherit"] +]); export const colors = { darkBlue: "#002d3a", @@ -32,5 +43,12 @@ export const colors = { blue1: "#57b2df", lightTurquoise: "#beddeb", green1: "#c0dcd9", - sand: "#fdf9d7" -} \ No newline at end of file + sand: "#fdf9d7", + transparent: "transparent", + inherit: "inherit" +} + +export const colorToClass = (color: Colors): string => color ? `color-div__${color}` : undefined; +export const bgColorToClass = (color: Colors): string => color ? `color-div__background_${color}` : undefined; +export const hoverColorToClass = (color: Colors): string => color ? `color-div__${color}Hoverable` : undefined; +export const bgHoverColorToClass = (color: Colors): string => color ? `color-div__background_${color}Hoverable` : undefined; diff --git a/src/views/ActualPage/ActualPageView.tsx b/src/views/ActualPage/ActualPageView.tsx index a44f3b2..c4eef99 100644 --- a/src/views/ActualPage/ActualPageView.tsx +++ b/src/views/ActualPage/ActualPageView.tsx @@ -1,16 +1,16 @@ import React from "react"; import "./ActualPage.scss"; import PageSection from "@components/PageSection"; -import HeroMainSection from "@components/Hero/HeroMainSection/HeroMainSection"; -import HeroAsideSection from "@components/Hero/HeroAsideSection/HeroAsideSection"; -import HeroAsideItem from "@components/Hero/HeroAsideItem/HeroAsideItem"; +import HeroMainSection from "@components/Hero/HeroMainSection"; +import HeroAsideSection from "@components/Hero/HeroAsideSection"; +import HeroAsideItem from "@components/Hero/HeroAsideItem"; import AsideSection from "@components/AsideSection"; -import MainSection from "@components/MainSection/index"; -import Ribbon from "@components/Ribbon/index"; -import TextAnchor from "@components/TextAnchor/index"; -import Button from "@components/Button/index"; +import MainSection from "@components/MainSection"; +import Ribbon from "@components/Ribbon"; +import TextAnchor from "@components/TextAnchor"; +import Button from "@components/Button"; import Accordion from "@components/Accordion"; -import HeroSecondarySection, { HeroSecondarySectionItem } from "@components/Hero/HeroSecondarySection/HeroSecondarySection"; +import HeroSecondarySection, { HeroSecondarySectionItem } from "@components/Hero/HeroSecondarySection"; import { Event } from "@models/Event"; import { Post } from "@models/Feed"; import EventCalendar from "./EventCalendar"; @@ -93,7 +93,7 @@ const ActualPageView: React.FC = ({events, feed}) => {

Kuvia tapahtumista.

- +
Kuvagalleria ›
@@ -106,7 +106,7 @@ const ActualPageView: React.FC = ({events, feed}) => {

Sinustako kilta-aktiivi?

- +
Tule mukaan kiltatoimintaan ›
diff --git a/src/views/ContactsPage/ContactsPageView.tsx b/src/views/ContactsPage/ContactsPageView.tsx index daf1e3d..2c530cc 100644 --- a/src/views/ContactsPage/ContactsPageView.tsx +++ b/src/views/ContactsPage/ContactsPageView.tsx @@ -3,7 +3,7 @@ import "./ContactsPage.scss"; import PageSection from "@components/PageSection"; import { Occupation, Committee } from "@models/Contacts"; import CommitteeContainer from "@components/CommitteeContainer"; -import TextAnchor from "@components/TextAnchor/index"; +import TextAnchor from "@components/TextAnchor"; interface ContactsPageViewProps { contacts: Occupation[]; diff --git a/src/views/CorporatePage/CorporatePageView.tsx b/src/views/CorporatePage/CorporatePageView.tsx index cc55c92..1a88bdb 100644 --- a/src/views/CorporatePage/CorporatePageView.tsx +++ b/src/views/CorporatePage/CorporatePageView.tsx @@ -1,14 +1,14 @@ import React from "react"; import "./CorporatePage.scss"; import PageSection from "@components/PageSection"; -import HeroMainSection from "@components/Hero/HeroMainSection/HeroMainSection"; -import HeroAsideSection from "@components/Hero/HeroAsideSection/HeroAsideSection"; -import HeroAsideItem from "@components/Hero/HeroAsideItem/HeroAsideItem"; +import HeroMainSection from "@components/Hero/HeroMainSection"; +import HeroAsideSection from "@components/Hero/HeroAsideSection"; +import HeroAsideItem from "@components/Hero/HeroAsideItem"; import AsideSection from "@components/AsideSection"; -import MainSection from "@components/MainSection/index"; -import PageLink from "@components/PageLink/index"; -import Ribbon from "@components/Ribbon/index"; -import TextAnchor from "@components/TextAnchor/index"; +import MainSection from "@components/MainSection"; +import PageLink from "@components/PageLink"; +import Ribbon from "@components/Ribbon"; +import TextAnchor from "@components/TextAnchor"; const CorporatePageView: React.FC = () => ( @@ -39,7 +39,7 @@ const CorporatePageView: React.FC = () => (

Lyhyesti killasta ja sen toiminnasta

- +

Aalto-yliopiston Sähköinsinöörikillan jäsenistöstä valmistuvat maan parhaimmat matematiikkaa ja fysiikkaa soveltavat huippuosaajat. Killan tehtävänä on pitää jäsenistään huolta ja edistää aktiivisesti jäsenten ja toimijoiden jaksamista. Killassa opitaan myös tärkeitä työelämätaitoja ammattimaisen killan johtamisen kautta.

Yhteistyömahdollisuudet

@@ -83,7 +83,7 @@ const CorporatePageView: React.FC = () => (

Mainos Sössöön?

- +

Killan lehden mediakortin löydät täältä›

diff --git a/src/views/EventPage/EventPageView.tsx b/src/views/EventPage/EventPageView.tsx index 0c7b439..cf6f558 100644 --- a/src/views/EventPage/EventPageView.tsx +++ b/src/views/EventPage/EventPageView.tsx @@ -17,27 +17,29 @@ const StyledSection = styled(MainSection)` max-width: 1000px; align-items: center; - h1 { + & > h1 { color: ${colors.darkBlue}; } - img { + & > div > img { + height: auto; width: 100%; - min-height: 100px; } - .event-desc { + & > p { color: ${colors.orange1}; } - - .event-signup-buttons { - display: flex; - flex-flow: row wrap; - justify-content: center; - } +`; + +const SignupButtons = styled.div` + display: flex; + flex-flow: row wrap; + justify-content: center; `; const Content = styled.div` + margin-top: 24px; + p { color: ${colors.black}; } @@ -79,15 +81,17 @@ const EventPageView: React.FC = ({ event }) => {

{event.title_fi}

-

+

{event.description_fi}

- {event.title_fi} +
+ {event.title_fi} +
{/* We may have multiple signup forms. Generate own Button for each one */} -
+ {event.signupForm.map(sf => (
+
); diff --git a/src/views/FreshmenPage/FreshmenPageView.tsx b/src/views/FreshmenPage/FreshmenPageView.tsx index ea01504..1442ddd 100644 --- a/src/views/FreshmenPage/FreshmenPageView.tsx +++ b/src/views/FreshmenPage/FreshmenPageView.tsx @@ -1,15 +1,15 @@ import React from "react"; import "./FreshmenPage.scss"; -import PageSection from "@components/PageSection/index"; -import HeroMainSection from "@components/Hero/HeroMainSection/HeroMainSection"; -import HeroAsideSection from "@components/Hero/HeroAsideSection/HeroAsideSection"; -import HeroAsideItem from "@components/Hero/HeroAsideItem/HeroAsideItem"; -import AsideSection from "@components/AsideSection/index"; -import MainSection from "@components/MainSection/index"; -import PageLink from "@components/PageLink/index"; -import Ribbon from "@components/Ribbon/index"; -import TextAnchor from "@components/TextAnchor/index"; -import InfoBox from "@components/InfoBox/index"; +import PageSection from "@components/PageSection"; +import HeroMainSection from "@components/Hero/HeroMainSection"; +import HeroAsideSection from "@components/Hero/HeroAsideSection"; +import HeroAsideItem from "@components/Hero/HeroAsideItem"; +import AsideSection from "@components/AsideSection"; +import MainSection from "@components/MainSection"; +import PageLink from "@components/PageLink"; +import Ribbon from "@components/Ribbon"; +import TextAnchor from "@components/TextAnchor"; +import InfoBox from "@components/InfoBox"; import styled from "styled-components"; const KippariImage = styled.img` @@ -54,7 +54,7 @@ const FreshmenPageView: React.FC = () => (

Olet tehnyt upean valinnan ottamalla askeleen matkalla, jossa sinusta ensin kehkeytyy teekkari ja myöhemmin diplomi-insinööri. Sinusta on juuri tullut tekniikan ylioppilas ja fuksi. Hieno saavutus, jota tietysti on syytä juhlia, ja tähän juhlaan paras sijainti on ehdottomasti Otaniemi. Tervetuloa!

Ensi askeleina suosittelen, että liityt teille fukseille tehdyille Telegram-kanaville. Tästä pääset tiedotuskanavalle ja tästä tutustumaan fuksikavereihin ja ISOihisi.

- +
Matka nimeltä Teekkarius

Teekkarin matka on jokaiselle oman näköisensä. Kilta, ylioppilaskunta ja Otaniemen muut järjestöt tarjoavat varmasti jokaiselle omanlaista tekemistä ja harrastusta. Olet nyt osa Aalto-yliopiston Sähköinsinöörikiltaa ja me tulemme tukemaan sinua teekkariuden matkalla, jotta löydät juuri sinulle sopivat paikat, joissa vaikuttaa ja harrastaa. Jotta tämä onnistuisi, olemme esimerkiksi sijoittaneet sinut fuksiryhmään, johon tulet Orientaatioviikolla tutustumaan ja josta saat oman tukiryhmän uusiin seikkailuihin. Fuksiryhmääsi kuuluu myös muutama ISO. Heistä löydät lisää tietoa alempaa.

@@ -102,7 +102,7 @@ const FreshmenPageView: React.FC = () => (

Killassa tapahtuu kaikenlaista!

- +

Seuraa killan tapahtumia

diff --git a/src/views/FrontPage/FrontPageView.tsx b/src/views/FrontPage/FrontPageView.tsx index 5ef7f0d..c0afdf6 100644 --- a/src/views/FrontPage/FrontPageView.tsx +++ b/src/views/FrontPage/FrontPageView.tsx @@ -7,12 +7,12 @@ import { Post } from "@models/Feed"; import PageSection from "@components/PageSection"; import PageLink from "@components/PageLink/PageLink"; -import HeroMainSection from "@components/Hero/HeroMainSection/HeroMainSection"; -import HeroAsideSection from "@components/Hero/HeroAsideSection/HeroAsideSection"; +import HeroMainSection from "@components/Hero/HeroMainSection"; +import HeroAsideSection from "@components/Hero/HeroAsideSection"; import Button from "@components/Button"; import Ribbon from "@components/Ribbon"; import SponsorReel from "@components/SponsorReel"; -import HeroAsideItem from "@components/Hero/HeroAsideItem/HeroAsideItem"; +import HeroAsideItem from "@components/Hero/HeroAsideItem"; import TextAnchor from "@components/TextAnchor"; interface FrontPageViewProps { @@ -89,7 +89,7 @@ const FrontPageView: React.FC = ({ events, feed }) => (

Sössöä vuodesta 1969.

- +

Lue opiskelijalehden viimeisin numero ›

diff --git a/src/views/GuildPage/GuildPageView.tsx b/src/views/GuildPage/GuildPageView.tsx index bc64479..bba4dfb 100644 --- a/src/views/GuildPage/GuildPageView.tsx +++ b/src/views/GuildPage/GuildPageView.tsx @@ -4,9 +4,9 @@ import PageSection from "@components/PageSection"; import MainSection from "@components/MainSection"; import AsideSection from "@components/AsideSection"; import PageLink from "@components/PageLink"; -import HeroMainSection from "@components/Hero/HeroMainSection/HeroMainSection"; -import HeroAsideSection from "@components/Hero/HeroAsideSection/HeroAsideSection"; -import HeroAsideItem from "@components/Hero/HeroAsideItem/HeroAsideItem"; +import HeroMainSection from "@components/Hero/HeroMainSection"; +import HeroAsideSection from "@components/Hero/HeroAsideSection"; +import HeroAsideItem from "@components/Hero/HeroAsideItem"; import Ribbon from "@components/Ribbon"; import InfoBox from "@components/InfoBox"; import Accordion from "@components/Accordion"; @@ -132,7 +132,7 @@ const GuildPageView: React.FC = () => (
-

Kiltatoimintaa järjestää ja ylläpitää kilta-aktiivit, toimikunnat ja jaokset.

+

Kiltatoimintaa järjestää ja ylläpitää kilta-aktiivit, toimikunnat ja jaokset.

diff --git a/src/views/StudiesPage/StudiesPageView.tsx b/src/views/StudiesPage/StudiesPageView.tsx index 8f52937..6c319a1 100644 --- a/src/views/StudiesPage/StudiesPageView.tsx +++ b/src/views/StudiesPage/StudiesPageView.tsx @@ -1,14 +1,14 @@ import React from "react"; import "./StudiesPage.scss"; -import PageSection from "@components/PageSection/index"; -import HeroMainSection from "@components/Hero/HeroMainSection/HeroMainSection"; -import HeroAsideSection from "@components/Hero/HeroAsideSection/HeroAsideSection"; -import HeroAsideItem from "@components/Hero/HeroAsideItem/HeroAsideItem"; -import AsideSection from "@components/AsideSection/index"; -import MainSection from "@components/MainSection/index"; -import PageLink from "@components/PageLink/index"; -import Ribbon from "@components/Ribbon/index"; -import TextAnchor from "@components/TextAnchor/index"; +import PageSection from "@components/PageSection"; +import HeroMainSection from "@components/Hero/HeroMainSection"; +import HeroAsideSection from "@components/Hero/HeroAsideSection"; +import HeroAsideItem from "@components/Hero/HeroAsideItem"; +import AsideSection from "@components/AsideSection"; +import MainSection from "@components/MainSection"; +import PageLink from "@components/PageLink"; +import Ribbon from "@components/Ribbon"; +import TextAnchor from "@components/TextAnchor"; const StudiesPageView: React.FC = () => (
@@ -54,17 +54,17 @@ const StudiesPageView: React.FC = () => (
Emmaleena

Fuksivuoden loppupuolella aloin haaveilla oman alan hommista ja päätin laittaa kesätyöhakemuksia yrityksiin ihan laidasta laitaan. Lopulta taisin laittaa niitä jopa 50… Ei mennyt kauaa, kun Profit Softwarelta oltiin yhteydessä ja pääsin sinne haastatteluun. Ennen pitkää olikin jo kesä ja olin päässyt osaksi Profit Softwaren automaatiotraineeteamiä. Jatkoin kesän jälkeen osa-aikaisena traineenä ja seuraavana kesänä pääsinkin scrum master -roolissa ohjaamaan useita erilaisia traineeprojekteja. Ihastuin projektienhallintaan ja jatkan projekti taitojen harjoittamista töissä edelleen.

- +
ALUMNIEN TARINOITA

SIKin alumneja löytyy vaikka mistä! Tässä muutama esimerkki erilaisista työtehtävistä ja tarinoista.

- Kurssitarjonta + Kurssitarjonta - Liity jäseneksi + Liity jäseneksi
@@ -72,7 +72,7 @@ const StudiesPageView: React.FC = () => (

Hae opiskelemaan!

- +

Lue lisää Aallon sivuilta

From ff9385cd47d165dda8c25462420b8288d6844fd7 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Fri, 9 Oct 2020 00:13:45 +0300 Subject: [PATCH 10/78] FrontPage improvements and PageSection prop reducing --- src/components/Divider.tsx | 10 ++ src/components/PageSection/PageSection.tsx | 39 +++-- src/components/index.tsx | 8 + src/pages/FrontPage.tsx | 3 +- src/views/ContactsPage/ContactsPageView.tsx | 16 +- src/views/FrontPage/FrontPage.scss | 7 - src/views/FrontPage/FrontPageHero.tsx | 52 ++++++ src/views/FrontPage/FrontPageView.tsx | 180 +++++++------------- 8 files changed, 167 insertions(+), 148 deletions(-) create mode 100644 src/components/Divider.tsx create mode 100644 src/components/index.tsx delete mode 100644 src/views/FrontPage/FrontPage.scss create mode 100644 src/views/FrontPage/FrontPageHero.tsx diff --git a/src/components/Divider.tsx b/src/components/Divider.tsx new file mode 100644 index 0000000..797e3fc --- /dev/null +++ b/src/components/Divider.tsx @@ -0,0 +1,10 @@ +import styled from "styled-components"; +import { colors } from "@theme/colors"; + +const Divider = styled.hr` + width: 98%; + border-color: ${colors.blue1}; + margin: 0 auto; +`; + +export default Divider; diff --git a/src/components/PageSection/PageSection.tsx b/src/components/PageSection/PageSection.tsx index baa9b6c..771c9c3 100644 --- a/src/components/PageSection/PageSection.tsx +++ b/src/components/PageSection/PageSection.tsx @@ -1,22 +1,28 @@ import React from "react"; import styled from "styled-components"; -import ColorDiv, { ColorDivProps } from "../ColorDiv/ColorDiv"; -import { colors } from "@theme/colors"; +import { ColorDivProps } from "../ColorDiv/ColorDiv"; +import { ColorMapper } from "@theme/colors"; interface PageSectionProps { center?: boolean; - bottomBorder?: boolean; cardSection?: boolean; // does section contain a grid of cards fullSize?: boolean; } -const Section = styled(ColorDiv)` +const Section = styled.section` display: flex; flex-flow: row wrap; justify-content: ${(p) => p.center ? "center" : "space-between"}; position: relative; padding: ${(p) => p.fullSize ? 0 : "2rem 1rem 2rem"}; + color: ${(p) => p.textColor}; + background-color: ${(p) => p.backgroundColor}; + &:hover { + color: ${(p) => p.hoverColor}; + background-color: ${(p) => p.hoverBackgroundColor}; + } + .lander-hero { @media screen and (min-width: 800px) { min-height: 85vh; @@ -28,23 +34,16 @@ const Section = styled(ColorDiv)` flex-flow: column nowrap; } `} - - ${(p) => p.bottomBorder ? ` - &::after { - content: ""; - position: absolute; - bottom: 0; - width: 98%; - left: 1%; - border-bottom: 1px solid rgba(${colors.blue1}, 0.4); - } - ` : ""} `; -const PageSection: React.FC = (props) => { - return ( -
- ); -} +const PageSection: React.FC = ({ textColor, backgroundColor, hoverColor, backgroundHoverColor, ...props }) => ( +
+); export default PageSection; diff --git a/src/components/index.tsx b/src/components/index.tsx new file mode 100644 index 0000000..84aac83 --- /dev/null +++ b/src/components/index.tsx @@ -0,0 +1,8 @@ +export { default as Card } from "./Card"; +export { default as PageLink } from "./PageLink"; +export { default as Button } from "./Button"; +export { default as Ribbon } from "./Ribbon"; +export { default as SponsorReel } from "./SponsorReel"; +export { default as TextAnchor } from "./TextAnchor"; +export { default as PageSection } from "./PageSection"; +export { default as Divider } from "./Divider"; \ No newline at end of file diff --git a/src/pages/FrontPage.tsx b/src/pages/FrontPage.tsx index 9f1917b..b32225d 100644 --- a/src/pages/FrontPage.tsx +++ b/src/pages/FrontPage.tsx @@ -78,8 +78,7 @@ class FrontPage extends React.Component { const { events, feed } = this.state; return ( <> - - + ) diff --git a/src/views/ContactsPage/ContactsPageView.tsx b/src/views/ContactsPage/ContactsPageView.tsx index 2c530cc..6743ebc 100644 --- a/src/views/ContactsPage/ContactsPageView.tsx +++ b/src/views/ContactsPage/ContactsPageView.tsx @@ -4,12 +4,15 @@ import PageSection from "@components/PageSection"; import { Occupation, Committee } from "@models/Contacts"; import CommitteeContainer from "@components/CommitteeContainer"; import TextAnchor from "@components/TextAnchor"; +import { Divider } from "@components/index"; interface ContactsPageViewProps { contacts: Occupation[]; committees: Committee[]; } + + class ContactsPageView extends React.Component { render() { const { contacts, committees } = this.props; @@ -22,7 +25,8 @@ class ContactsPageView extends React.Component { Tämä sivu yrittää valottaa sen oikean ihmisen puhelinnumeroa ja sähköpostiosoitetta.

- + +

@@ -36,12 +40,16 @@ class ContactsPageView extends React.Component {

+ {committees.map((committee, index) => { const order = committee.name_fi === "Toimikunnattomat" ? 1 : 0; return ( - - x.role.committee.name_fi === committee.name_fi)} /> - + <> + + x.role.committee.name_fi === committee.name_fi)} /> + + + ) })}
diff --git a/src/views/FrontPage/FrontPage.scss b/src/views/FrontPage/FrontPage.scss deleted file mode 100644 index bbedfd6..0000000 --- a/src/views/FrontPage/FrontPage.scss +++ /dev/null @@ -1,7 +0,0 @@ -@import "../../assets/scss/globals"; - -.front-page { - display: flex; - flex-flow: column wrap; - justify-content: flex-start; -} diff --git a/src/views/FrontPage/FrontPageHero.tsx b/src/views/FrontPage/FrontPageHero.tsx new file mode 100644 index 0000000..2970031 --- /dev/null +++ b/src/views/FrontPage/FrontPageHero.tsx @@ -0,0 +1,52 @@ +import React from "react"; +import { PageSection, Button } from "@components/index"; +import HeroMainSection from "@components/Hero/HeroMainSection"; +import HeroAsideSection from "@components/Hero/HeroAsideSection"; +import HeroAsideItem from "@components/Hero/HeroAsideItem"; + +const FrontPageHero: React.FC = () => ( + + +

Aalto-yliopiston Sähköinsinöörikilta

+

+ on elektroniikan ja sähkötekniikan opiskelijoiden järjestö. Kilta + kasaa yhteen yli 600 alansa huippua, jotka ovat avainasemassa + vauhdilla sähköistyvän maailmamme kehityksessä. +

+
+ + +
+
+ + + Fuksikasvatusta, ISO-toimintaa, lorem ipsum dolor sit ja amet. + + + Oletko abi, vaihtamassa uraa tai valmistumassa? + + + Avoimet työpaikat ja excursiot. Infoa yritysten edustajille ja + sponsseille. + + +
+); + +export default FrontPageHero; \ No newline at end of file diff --git a/src/views/FrontPage/FrontPageView.tsx b/src/views/FrontPage/FrontPageView.tsx index c0afdf6..60f08c4 100644 --- a/src/views/FrontPage/FrontPageView.tsx +++ b/src/views/FrontPage/FrontPageView.tsx @@ -1,131 +1,81 @@ import React from "react"; -import "./FrontPage.scss"; -import Card from "@components/Card"; +import { PageSection, Card, PageLink, Button, Ribbon, SponsorReel, TextAnchor, Divider } from "@components/index"; +import FrontPageHero from "./FrontPageHero"; import { Event } from "@models/Event"; import { Post } from "@models/Feed"; -import PageSection from "@components/PageSection"; - -import PageLink from "@components/PageLink/PageLink"; -import HeroMainSection from "@components/Hero/HeroMainSection"; -import HeroAsideSection from "@components/Hero/HeroAsideSection"; -import Button from "@components/Button"; -import Ribbon from "@components/Ribbon"; -import SponsorReel from "@components/SponsorReel"; -import HeroAsideItem from "@components/Hero/HeroAsideItem"; -import TextAnchor from "@components/TextAnchor"; - interface FrontPageViewProps { events: Event[]; feed: Post[]; } const FrontPageView: React.FC = ({ events, feed }) => ( -
- - -

Aalto-yliopiston Sähköinsinöörikilta

-

- on elektroniikan ja sähkötekniikan opiskelijoiden järjestö. Kilta - kasaa yhteen yli 600 alansa huippua, jotka ovat avainasemassa - vauhdilla sähköistyvän maailmamme kehityksessä. -

-
- - -
-
- - - Fuksikasvatusta, ISO-toimintaa, lorem ipsum dolor sit ja amet. - - - Oletko abi, vaihtamassa uraa tai valmistumassa? - - - Avoimet työpaikat ja excursiot. Infoa yritysten edustajille ja - sponsseille. - - -
- - {events.map(event => ( - { }}> -
Lue lisää ›
- - } - /> - ))} -
- + <> + +
+ + {events.map(event => ( + { }}> +
Lue lisää ›
+ + } + /> + ))} +
+ Kaikki tapahtumat - -
-
- - -

Sössöä vuodesta 1969.

- -

Lue opiskelijalehden viimeisin numero ›

-
-
-
- - {feed.map(inst => ( - { }}> -
Lue lisää ›
- - } - /> - ))} -
- + +
+
+ + +

Sössöä vuodesta 1969.

+ +

Lue opiskelijalehden viimeisin numero ›

+
+
+
+ + {feed.map(inst => ( + { }}> +
Lue lisää ›
+ + } + /> + ))} +
+ Lue tuoreimmat uutiset - - + + Kuvia tapahtumista - -
-
- - - -
+ +
+ + + + + + + ) export default FrontPageView; From 29b913b834671282bad9901ba7fe073974df37f8 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Fri, 9 Oct 2020 21:06:41 +0300 Subject: [PATCH 11/78] WIP FrontPage rewrite --- src/components/Card/Card.tsx | 66 +++--- src/components/Divider.tsx | 3 +- src/components/Footer/Footer.scss | 90 --------- src/components/Footer/Footer.tsx | 145 +++++++++---- src/components/FooterMap/FooterMap.scss | 13 -- src/components/FooterMap/FooterMap.tsx | 30 +-- src/components/PageLink/PageLink.scss | 31 --- src/components/PageLink/PageLink.tsx | 49 +++-- .../{PageSection => }/PageSection.tsx | 2 +- src/components/PageSection/index.ts | 2 - src/components/PageSection2.tsx | 91 +++++++++ src/components/index.tsx | 2 +- src/index.scss | 2 + src/theme/colors.ts | 2 + src/views/ActualPage/EventCalendar.tsx | 7 +- src/views/ActualPage/News.tsx | 7 +- src/views/FrontPage/FrontPageHero.tsx | 190 ++++++++++++++---- src/views/FrontPage/FrontPageView.tsx | 84 +++++--- 18 files changed, 499 insertions(+), 317 deletions(-) delete mode 100644 src/components/Footer/Footer.scss delete mode 100644 src/components/FooterMap/FooterMap.scss delete mode 100644 src/components/PageLink/PageLink.scss rename src/components/{PageSection => }/PageSection.tsx (96%) delete mode 100644 src/components/PageSection/index.ts create mode 100644 src/components/PageSection2.tsx diff --git a/src/components/Card/Card.tsx b/src/components/Card/Card.tsx index 9f2e377..9958adf 100644 --- a/src/components/Card/Card.tsx +++ b/src/components/Card/Card.tsx @@ -1,53 +1,57 @@ import React from "react"; import "./Card.scss"; import Anchor from "../Anchor"; +import { Button } from "@components/index"; -export interface CardProps { +interface CardProps { title: string; start_time: string; text: string; link?: string; image?: string; - button?: JSX.Element; + buttonText?: string; + buttonOnClick?: () => void; } -export interface CardState { } -class Card extends React.Component { - render() { - const { title, text, link, image, button } = this.props; - const options = { - day: "numeric", - month: "numeric", - year: "numeric", - hour: "numeric", - minute: "2-digit" - }; - const datetime = new Date(this.props.start_time).toLocaleString("fi-FI", options); +const Card: React.FC = ({ title, text, link, image, buttonText, start_time, buttonOnClick }) => { + const options = { + day: "numeric", + month: "numeric", + year: "numeric", + hour: "numeric", + minute: "2-digit" + }; + const datetime = new Date(start_time).toLocaleString("fi-FI", options); - const imageElem = image ? ( -
- ) : null; - if (link) { - return ( - - {imageElem} -
{datetime}
-
{title}
-
{text}
-
{button}
-
- ); - } + const imageElem = image ? ( +
+ ) : null; + if (link) { return ( -
+ {imageElem}
{datetime}
{title}
{text}
- {button} -
+
+ +
+ ); } + return ( +
+ {imageElem} +
{datetime}
+
{title}
+
{text}
+ +
+ ); } export default Card; diff --git a/src/components/Divider.tsx b/src/components/Divider.tsx index 797e3fc..1093cdd 100644 --- a/src/components/Divider.tsx +++ b/src/components/Divider.tsx @@ -3,7 +3,8 @@ import { colors } from "@theme/colors"; const Divider = styled.hr` width: 98%; - border-color: ${colors.blue1}; + border: 0; + border-bottom: 2px solid ${colors.blue1}; margin: 0 auto; `; diff --git a/src/components/Footer/Footer.scss b/src/components/Footer/Footer.scss deleted file mode 100644 index 2def50a..0000000 --- a/src/components/Footer/Footer.scss +++ /dev/null @@ -1,90 +0,0 @@ -@import "../../assets/scss/globals"; - - -.footer { - display: flex; - flex-direction: column; - - &__content { - display: flex; - padding: 16px; - } - - h4 { - color: color(light-blue); - padding: 1.5rem 0; - } - - & a { - color: color(white1); - text-decoration: underline; - padding: 0.4rem 0; - font-size: 14px; - } - - & p { - color: color(white1); - margin: 0; - padding: 0.4rem 0; - font-size: 14px; - } - - &__info { - display: flex; - flex-direction: column; - flex-basis: 100%; - align-items: center; - - &__block { - padding: 1rem 0; - } - } - - &__contacts { - display: flex; - justify-content: space-between; - flex-flow: row nowrap; - font-weight: 200; - - @media screen and (max-width: 600px - 1px) { - flex-flow: column nowrap; - } - } - - &__text { - display: flex; - flex-flow: column; - min-width: 180px; - - @media screen and (min-width: 600px) { - padding-right: 3rem; - } - } - - &__links { - display: flex; - flex-flow: column; - - @media screen and (max-width: 600px - 1px) { - margin-top: 2rem; - } - } - - &__copyright { - display: flex; - flex-flow: row nowrap; - background-color: color(black1); - text-align: center; - justify-content: center; - font-size: 12px; - padding: 1rem 0; - - p { - padding: 0.5rem 1rem; - } - - @media screen and (max-width: 600px - 1px) { - flex-flow: column nowrap; - } - } -} diff --git a/src/components/Footer/Footer.tsx b/src/components/Footer/Footer.tsx index c816204..059dad5 100644 --- a/src/components/Footer/Footer.tsx +++ b/src/components/Footer/Footer.tsx @@ -1,48 +1,115 @@ import React from "react"; -import FooterMap from "../FooterMap"; +import styled from "styled-components"; import Anchor from "../Anchor"; -import "./Footer.scss"; +import { colors } from "@theme/colors"; -export interface FooterProps { } -export interface FooterState { } +const StyledFooter = styled.footer` + display: flex; + flex-direction: column; + background-color: ${colors.darkBlue}; -class Footer extends React.Component { - render() { - return -
-
-
-
-

Aalto-yliopiston Sähköinsinöörikilta ry

-
-
-

TUAS-Talo

-

Maarintie 8

-

PL 15500, 00076 Aalto

-

-

-

Y-tunnus: 1627010-1

-

sik-hallitus@list.ayy.fi

- Yhteystiedot -
-
- Jäseneksi - Palaute - Arkisto - Materiaalipankki -
-
-
+ a { + color: ${colors.white}; + display: block; + text-decoration: underline; + padding: 0.4rem 0; + font-size: 14px; + + &:hover { + text-decoration: none; + } + } + + p { + color: ${colors.white}; + margin: 0; + padding: 0.4rem 0; + font-size: 14px; + } +`; + +const Content = styled.div` + display: flex; + & > div { + flex: 2; + padding: 48px 0; + + h4 { + color: ${colors.lightBlue}; + padding: 24px 0; + } + + & > div { + display: flex; + flex-direction: row; + justify-content: space-between; + } + } +`; + +const CopyRight = styled.div` + display: flex; + flex-flow: row nowrap; + background-color: ${colors.black}; + text-align: center; + justify-content: center; + font-size: 12px; + padding: 1rem 0; + + p { + padding: 0.5rem 1rem; + } + + @media screen and (max-width: 600px - 1px) { + flex-flow: column nowrap; + } +`; + +const Map = styled.iframe` + border: none; + flex: 1; + + @media screen and (max-width: 1200px - 1px) { + display: none; + } +`; + +const Footer: React.FC = () => ( + + +
+

Aalto-yliopiston Sähköinsinöörikilta ry

+
+
+

TUAS-Talo

+

Maarintie 8

+

PL 15500, 00076 Aalto

+

+

+

Y-tunnus: 1627010-1

+

sik-hallitus@list.ayy.fi

+ Yhteystiedot +
+ +
+ Jäseneksi + Palaute + Arkisto + Materiaalipankki
- -
-
-

© Aalto-yliopiston Sähköinsinöörikilta ry

-

webmaster: sik-vtmk@list.ayy.fi

- ; - } -} + +
+ +

© Aalto-yliopiston Sähköinsinöörikilta ry

+ webmaster: sik-vtmk@list.ayy.fi +
+
+) export default Footer; diff --git a/src/components/FooterMap/FooterMap.scss b/src/components/FooterMap/FooterMap.scss deleted file mode 100644 index 09a3654..0000000 --- a/src/components/FooterMap/FooterMap.scss +++ /dev/null @@ -1,13 +0,0 @@ -@import "../../assets/scss/globals"; - -.footer-map { - display: flex; - - @media screen and (max-width: 1200px - 1px) { - display: none; - } - - iframe { - border: none; - } -} diff --git a/src/components/FooterMap/FooterMap.tsx b/src/components/FooterMap/FooterMap.tsx index bddca1a..4ede894 100644 --- a/src/components/FooterMap/FooterMap.tsx +++ b/src/components/FooterMap/FooterMap.tsx @@ -1,26 +1,16 @@ import React from "react"; -import "./FooterMap.scss"; +import styled from "styled-components"; -const AnyReactComponent = ({ text }) =>
{text}
; +const IFrame = styled.iframe` -export interface FooterMapProps {} +`; -export interface FooterMapState {} - -class FooterMap extends React.Component { - render() { - return ( -
- -
- - ); - } -} +const FooterMap: React.FC = () => ( +