diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f387062..c243d1d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -130,7 +130,7 @@ deploy:prod: - production environment: name: production - url: prod.sahkoinsinoorikilta.fi + url: sahkoinsinoorikilta.fi when: manual variables: DOCKER_HOST: $CI_DOCKER_HOST diff --git a/package-lock.json b/package-lock.json index 54dcefa..784146a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,7 @@ "react-jsonschema-form": "1.8.1", "react-markdown": "5.0.3", "react-mde": "11.0.6", + "react-toastify": "^7.0.3", "shortid": "2.2.16", "styled-components": "5.2.1", "swr": "0.4.2" @@ -3012,9 +3013,6 @@ "dev": true, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@hapi/accept": { @@ -3086,10 +3084,6 @@ "source-map": "0.8.0-beta.0", "stacktrace-parser": "0.1.10", "strip-ansi": "6.0.0" - }, - "peerDependencies": { - "react": "^16.9.0 || ^17", - "react-dom": "^16.9.0 || ^17" } }, "node_modules/@next/react-dev-overlay/node_modules/ansi-regex": { @@ -3109,9 +3103,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@next/react-dev-overlay/node_modules/chalk": { @@ -3124,9 +3115,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@next/react-dev-overlay/node_modules/color-convert": { @@ -3189,16 +3177,7 @@ "node_modules/@next/react-refresh-utils": { "version": "10.0.8", "resolved": "https://registry.npmjs.org/@next/react-refresh-utils/-/react-refresh-utils-10.0.8.tgz", - "integrity": "sha512-ZMO77Xs2ioGV/nZB4GRDHgsNT2jhOp+cZIh6c7wf0xw9o/1KoTWN8nxWzwU/laAtkoSS+E6YdhuR4Mw3Ar3CSg==", - "peerDependencies": { - "react-refresh": "0.8.3", - "webpack": "^4 || ^5" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } + "integrity": "sha512-ZMO77Xs2ioGV/nZB4GRDHgsNT2jhOp+cZIh6c7wf0xw9o/1KoTWN8nxWzwU/laAtkoSS+E6YdhuR4Mw3Ar3CSg==" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.3", @@ -3489,19 +3468,6 @@ }, "engines": { "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } } }, "node_modules/@typescript-eslint/experimental-utils": { @@ -3519,13 +3485,6 @@ }, "engines": { "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" } }, "node_modules/@typescript-eslint/parser": { @@ -3541,18 +3500,6 @@ }, "engines": { "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } } }, "node_modules/@typescript-eslint/scope-manager": { @@ -3566,10 +3513,6 @@ }, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/types": { @@ -3579,10 +3522,6 @@ "dev": true, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/typescript-estree": { @@ -3601,15 +3540,6 @@ }, "engines": { "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/@nodelib/fs.stat": { @@ -3686,9 +3616,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/ignore": { @@ -3745,10 +3672,6 @@ }, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { @@ -3785,10 +3708,7 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } + "dev": true }, "node_modules/acorn-walk": { "version": "8.0.1", @@ -3820,10 +3740,6 @@ "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/amdefine": { @@ -4071,6 +3987,7 @@ "integrity": "sha512-d2Ovma+bfqNpvBzY/KU8oPY67ZworixTpkjSx0PCXnQi67c2cXmssaTxpFDUM0ttopXoGx/KRxNg/GDThYbXQA==", "dev": true, "dependencies": { + "@types/glob": "^7.1.1", "chromium-pickle-js": "^0.2.0", "commander": "^2.20.0", "cuint": "^0.2.2", @@ -4084,9 +4001,6 @@ }, "engines": { "node": ">=8.0" - }, - "optionalDependencies": { - "@types/glob": "^7.1.1" } }, "node_modules/asn1.js": { @@ -4328,9 +4242,6 @@ "@babel/helper-module-imports": "^7.0.0", "babel-plugin-syntax-jsx": "^6.18.0", "lodash": "^4.17.11" - }, - "peerDependencies": { - "styled-components": ">= 2" } }, "node_modules/babel-plugin-syntax-jsx": { @@ -4747,9 +4658,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/camelize": { @@ -4974,6 +4882,14 @@ "node": ">=6" } }, + "node_modules/clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", + "engines": { + "node": ">=6" + } + }, "node_modules/code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -5452,10 +5368,6 @@ "integrity": "sha512-NYyAg4wRmGVU4miKq5ivRACOODdZRY3q5WLmOJSq8djyzftYphU7dTHLcEtLqEvfqMKQ0jVv91P4BAwIjsXIcw==", "engines": { "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" } }, "node_modules/debug": { @@ -6078,9 +5990,6 @@ }, "engines": { "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-config-airbnb": { @@ -7230,9 +7139,6 @@ }, "bin": { "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, "node_modules/flatted": { @@ -7376,9 +7282,6 @@ }, "engines": { "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { @@ -7453,9 +7356,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globals/node_modules/type-fest": { @@ -7864,16 +7764,6 @@ "resolved": "https://registry.npmjs.org/husky/-/husky-5.1.3.tgz", "integrity": "sha512-fbNJ+Gz5wx2LIBtMweJNY1D7Uc8p1XERi5KNRMccwfQA+rXlxWNSdUxswo0gT8XqxywTIw7Ywm/F4v/O35RdMg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/typicode" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/husky" - } - ], "bin": { "husky": "lib/bin.js" }, @@ -7917,9 +7807,6 @@ }, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/import-lazy": { @@ -8965,9 +8852,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/matcher/node_modules/escape-string-regexp": { @@ -8977,9 +8861,6 @@ "dev": true, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/mathml-tag-names": { @@ -9090,9 +8971,6 @@ }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/meow/node_modules/hosted-git-info": { @@ -9141,9 +9019,6 @@ "dev": true, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/merge-stream": { @@ -9491,24 +9366,6 @@ }, "engines": { "node": ">=10.13.0" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0", - "react": "^16.6.0 || ^17", - "react-dom": "^16.6.0 || ^17", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - } } }, "node_modules/next-sitemap": { @@ -9523,9 +9380,6 @@ }, "bin": { "next-sitemap": "bin/next-sitemap" - }, - "peerDependencies": { - "next": "*" } }, "node_modules/next/node_modules/browserslist": { @@ -10412,9 +10266,6 @@ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "engines": { "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/pidtree": { @@ -11260,11 +11111,7 @@ "node_modules/react-mde": { "version": "11.0.6", "resolved": "https://registry.npmjs.org/react-mde/-/react-mde-11.0.6.tgz", - "integrity": "sha512-yWiPSurQvjLVD070zycQR4x5zW3f/kxPlqOMmZoUtVQvUgcM+kwpDQAba5sqtqtAurgUx0Ae9p9Xzgqwt2+ZBA==", - "peerDependencies": { - "react": "^16.0.0", - "react-dom": "^16.0.0" - } + "integrity": "sha512-yWiPSurQvjLVD070zycQR4x5zW3f/kxPlqOMmZoUtVQvUgcM+kwpDQAba5sqtqtAurgUx0Ae9p9Xzgqwt2+ZBA==" }, "node_modules/react-redux": { "version": "7.2.2", @@ -11320,6 +11167,18 @@ "node": ">=0.10.0" } }, + "node_modules/react-toastify": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-7.0.3.tgz", + "integrity": "sha512-cxZ5rfurC8LzcZQMTYc8RHIkQTs+BFur18Pzk6Loz6uS8OXUWm6nXVlH/wqglz4Z7UAE8xxcF5mRjfE13487uQ==", + "dependencies": { + "clsx": "^1.1.1" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, "node_modules/read-file-relative": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/read-file-relative/-/read-file-relative-1.2.0.tgz", @@ -11355,9 +11214,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/find-up": { @@ -11395,9 +11251,6 @@ }, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/p-locate": { @@ -11434,9 +11287,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/path-exists": { @@ -12957,10 +12807,6 @@ }, "engines": { "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/stylelint" } }, "node_modules/stylelint-config-recommended": { @@ -13707,9 +13553,6 @@ "integrity": "sha512-SKGxcAfyijj/lE5ja5zVMDqJNudASH3WZPRUakDVOePTM18FnsXgugndjl9BSRwj+jokFCulMDe7F2pQL+VhEw==", "dependencies": { "dequal": "2.0.2" - }, - "peerDependencies": { - "react": "^16.11.0 || ^17.0.0" } }, "node_modules/symbol-observable": { @@ -18480,8 +18323,7 @@ "@next/react-refresh-utils": { "version": "10.0.8", "resolved": "https://registry.npmjs.org/@next/react-refresh-utils/-/react-refresh-utils-10.0.8.tgz", - "integrity": "sha512-ZMO77Xs2ioGV/nZB4GRDHgsNT2jhOp+cZIh6c7wf0xw9o/1KoTWN8nxWzwU/laAtkoSS+E6YdhuR4Mw3Ar3CSg==", - "requires": {} + "integrity": "sha512-ZMO77Xs2ioGV/nZB4GRDHgsNT2jhOp+cZIh6c7wf0xw9o/1KoTWN8nxWzwU/laAtkoSS+E6YdhuR4Mw3Ar3CSg==" }, "@nodelib/fs.scandir": { "version": "2.1.3", @@ -18942,8 +18784,7 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true, - "requires": {} + "dev": true }, "acorn-walk": { "version": "8.0.1", @@ -19934,6 +19775,11 @@ "is-regexp": "^2.0.0" } }, + "clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" + }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -25128,8 +24974,7 @@ "react-mde": { "version": "11.0.6", "resolved": "https://registry.npmjs.org/react-mde/-/react-mde-11.0.6.tgz", - "integrity": "sha512-yWiPSurQvjLVD070zycQR4x5zW3f/kxPlqOMmZoUtVQvUgcM+kwpDQAba5sqtqtAurgUx0Ae9p9Xzgqwt2+ZBA==", - "requires": {} + "integrity": "sha512-yWiPSurQvjLVD070zycQR4x5zW3f/kxPlqOMmZoUtVQvUgcM+kwpDQAba5sqtqtAurgUx0Ae9p9Xzgqwt2+ZBA==" }, "react-redux": { "version": "7.2.2", @@ -25181,6 +25026,14 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==" }, + "react-toastify": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-7.0.3.tgz", + "integrity": "sha512-cxZ5rfurC8LzcZQMTYc8RHIkQTs+BFur18Pzk6Loz6uS8OXUWm6nXVlH/wqglz4Z7UAE8xxcF5mRjfE13487uQ==", + "requires": { + "clsx": "^1.1.1" + } + }, "read-file-relative": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/read-file-relative/-/read-file-relative-1.2.0.tgz", diff --git a/package.json b/package.json index 8ba107e..625ce7f 100644 --- a/package.json +++ b/package.json @@ -79,6 +79,7 @@ "react-jsonschema-form": "1.8.1", "react-markdown": "5.0.3", "react-mde": "11.0.6", + "react-toastify": "^7.0.3", "shortid": "2.2.16", "styled-components": "5.2.1", "swr": "0.4.2" diff --git a/public/img/Varaslahto2020-AinoSuomi-73.jpg b/public/img/Varaslahto2020-AinoSuomi-73.jpg deleted file mode 100644 index 35ad05b..0000000 Binary files a/public/img/Varaslahto2020-AinoSuomi-73.jpg and /dev/null differ diff --git a/public/img/beer.jpeg b/public/img/beer.jpeg deleted file mode 100644 index 56c0da5..0000000 Binary files a/public/img/beer.jpeg and /dev/null differ diff --git a/public/img/carousel_images/Varaslahto2020-AinoSuomi-73.jpg b/public/img/carousel_images/Varaslahto2020-AinoSuomi-73.jpg deleted file mode 100644 index 35ad05b..0000000 Binary files a/public/img/carousel_images/Varaslahto2020-AinoSuomi-73.jpg and /dev/null differ diff --git a/public/img/carousel_images/elecyykka-jani-mannonen-6.jpg b/public/img/carousel_images/elecyykka-jani-mannonen-6.jpg deleted file mode 100644 index 9c0106a..0000000 Binary files a/public/img/carousel_images/elecyykka-jani-mannonen-6.jpg and /dev/null differ diff --git a/public/img/carousel_images/in_english/Kaukkarit-2020-Elias-Hirvonen-44.jpg b/public/img/carousel_images/in_english/Kaukkarit-2020-Elias-Hirvonen-44.jpg deleted file mode 100644 index 395eb70..0000000 Binary files a/public/img/carousel_images/in_english/Kaukkarit-2020-Elias-Hirvonen-44.jpg and /dev/null differ diff --git a/public/img/carousel_images/in_english/haalarigaala-jani-mannonen-1.jpg b/public/img/carousel_images/in_english/haalarigaala-jani-mannonen-1.jpg deleted file mode 100644 index 598532a..0000000 Binary files a/public/img/carousel_images/in_english/haalarigaala-jani-mannonen-1.jpg and /dev/null differ diff --git a/public/img/carousel_images/in_english/international-sitsit-jani-mannonen-8.jpg b/public/img/carousel_images/in_english/international-sitsit-jani-mannonen-8.jpg deleted file mode 100644 index 98a1599..0000000 Binary files a/public/img/carousel_images/in_english/international-sitsit-jani-mannonen-8.jpg and /dev/null differ diff --git a/public/img/carousel_images/in_english/koydenveto-jani-mannonen-miika-koskela-4.jpg b/public/img/carousel_images/in_english/koydenveto-jani-mannonen-miika-koskela-4.jpg deleted file mode 100644 index 942ab0b..0000000 Binary files a/public/img/carousel_images/in_english/koydenveto-jani-mannonen-miika-koskela-4.jpg and /dev/null differ diff --git a/public/img/carousel_images/in_english/tour/qtour1.jpg b/public/img/carousel_images/in_english/tour/qtour1.jpg deleted file mode 100644 index aa47fe5..0000000 Binary files a/public/img/carousel_images/in_english/tour/qtour1.jpg and /dev/null differ diff --git a/public/img/carousel_images/in_english/tour/qtour2.jpg b/public/img/carousel_images/in_english/tour/qtour2.jpg deleted file mode 100644 index e57447a..0000000 Binary files a/public/img/carousel_images/in_english/tour/qtour2.jpg and /dev/null differ diff --git a/public/img/carousel_images/in_english/tour/qtour3.jpg b/public/img/carousel_images/in_english/tour/qtour3.jpg deleted file mode 100644 index 97ef056..0000000 Binary files a/public/img/carousel_images/in_english/tour/qtour3.jpg and /dev/null differ diff --git a/public/img/carousel_images/in_english/tour/qtour4.jpg b/public/img/carousel_images/in_english/tour/qtour4.jpg deleted file mode 100644 index 49af5d7..0000000 Binary files a/public/img/carousel_images/in_english/tour/qtour4.jpg and /dev/null differ diff --git a/public/img/carousel_images/in_english/tour/qtour5.jpg b/public/img/carousel_images/in_english/tour/qtour5.jpg deleted file mode 100644 index e4916d5..0000000 Binary files a/public/img/carousel_images/in_english/tour/qtour5.jpg and /dev/null differ diff --git a/public/img/carousel_images/in_english/ulkoexcursio-kiia-einola-16.jpg b/public/img/carousel_images/in_english/ulkoexcursio-kiia-einola-16.jpg deleted file mode 100644 index 15bfa8b..0000000 Binary files a/public/img/carousel_images/in_english/ulkoexcursio-kiia-einola-16.jpg and /dev/null differ diff --git a/public/img/carousel_images/in_english/ulkoexcursio1-kiia-einola-3.jpg b/public/img/carousel_images/in_english/ulkoexcursio1-kiia-einola-3.jpg deleted file mode 100644 index e1961a8..0000000 Binary files a/public/img/carousel_images/in_english/ulkoexcursio1-kiia-einola-3.jpg and /dev/null differ diff --git a/public/img/carousel_images/kokkarit_kiia_einola-0631.jpg b/public/img/carousel_images/kokkarit_kiia_einola-0631.jpg deleted file mode 100644 index 65cc7e5..0000000 Binary files a/public/img/carousel_images/kokkarit_kiia_einola-0631.jpg and /dev/null differ diff --git a/public/img/carousel_images/koydenveto-jani-mannonen-miika-koskela-17.jpg b/public/img/carousel_images/koydenveto-jani-mannonen-miika-koskela-17.jpg deleted file mode 100644 index 95b8ba0..0000000 Binary files a/public/img/carousel_images/koydenveto-jani-mannonen-miika-koskela-17.jpg and /dev/null differ diff --git a/public/img/carousel_images/koydenveto-jani-mannonen-miika-koskela-28.jpg b/public/img/carousel_images/koydenveto-jani-mannonen-miika-koskela-28.jpg deleted file mode 100644 index 45d51bf..0000000 Binary files a/public/img/carousel_images/koydenveto-jani-mannonen-miika-koskela-28.jpg and /dev/null differ diff --git a/public/img/carousel_images/koydenveto-jani-mannonen-miika-koskela-78.jpg b/public/img/carousel_images/koydenveto-jani-mannonen-miika-koskela-78.jpg deleted file mode 100644 index 26509ee..0000000 Binary files a/public/img/carousel_images/koydenveto-jani-mannonen-miika-koskela-78.jpg and /dev/null differ diff --git a/public/img/carousel_images/koydenveto-mikko-haapamaki-33.jpg b/public/img/carousel_images/koydenveto-mikko-haapamaki-33.jpg deleted file mode 100644 index 7c6374f..0000000 Binary files a/public/img/carousel_images/koydenveto-mikko-haapamaki-33.jpg and /dev/null differ diff --git a/public/img/carousel_images/otatarhan-ajot-timi-tiira-172.jpg b/public/img/carousel_images/otatarhan-ajot-timi-tiira-172.jpg deleted file mode 100644 index 8559e6f..0000000 Binary files a/public/img/carousel_images/otatarhan-ajot-timi-tiira-172.jpg and /dev/null differ diff --git a/public/img/carousel_images/pota-jatkot-essi-jukkala-29.jpg b/public/img/carousel_images/pota-jatkot-essi-jukkala-29.jpg deleted file mode 100644 index 462f5a6..0000000 Binary files a/public/img/carousel_images/pota-jatkot-essi-jukkala-29.jpg and /dev/null differ diff --git a/public/img/carousel_images/pota99-paajuhla-oskari-lahti-171.jpg b/public/img/carousel_images/pota99-paajuhla-oskari-lahti-171.jpg deleted file mode 100644 index 0da4665..0000000 Binary files a/public/img/carousel_images/pota99-paajuhla-oskari-lahti-171.jpg and /dev/null differ diff --git a/public/img/carousel_images/varauksenpurku_2020_timitiira-80.jpg b/public/img/carousel_images/varauksenpurku_2020_timitiira-80.jpg deleted file mode 100644 index 5842b46..0000000 Binary files a/public/img/carousel_images/varauksenpurku_2020_timitiira-80.jpg and /dev/null differ diff --git a/public/img/carousel_images/wappusitsit-jani-mannonen-29.jpg b/public/img/carousel_images/wappusitsit-jani-mannonen-29.jpg deleted file mode 100644 index b08d75a..0000000 Binary files a/public/img/carousel_images/wappusitsit-jani-mannonen-29.jpg and /dev/null differ diff --git a/public/img/corporate_logos/abb.png b/public/img/corporate_logos/abb.png deleted file mode 100644 index d3f5065..0000000 Binary files a/public/img/corporate_logos/abb.png and /dev/null differ diff --git a/public/img/corporate_logos/capgemini.png b/public/img/corporate_logos/capgemini.png deleted file mode 100644 index b94cd09..0000000 Binary files a/public/img/corporate_logos/capgemini.png and /dev/null differ diff --git a/public/img/corporate_logos/caruna.jpg b/public/img/corporate_logos/caruna.jpg deleted file mode 100644 index 417f666..0000000 Binary files a/public/img/corporate_logos/caruna.jpg and /dev/null differ diff --git a/public/img/corporate_logos/eaton.png b/public/img/corporate_logos/eaton.png deleted file mode 100644 index d5ce446..0000000 Binary files a/public/img/corporate_logos/eaton.png and /dev/null differ diff --git a/public/img/corporate_logos/ensto.jpg b/public/img/corporate_logos/ensto.jpg deleted file mode 100644 index 88d4232..0000000 Binary files a/public/img/corporate_logos/ensto.jpg and /dev/null differ diff --git a/public/img/corporate_logos/esett.png b/public/img/corporate_logos/esett.png deleted file mode 100644 index 10eacb5..0000000 Binary files a/public/img/corporate_logos/esett.png and /dev/null differ diff --git a/public/img/corporate_logos/fennovoima.png b/public/img/corporate_logos/fennovoima.png deleted file mode 100644 index a91f81f..0000000 Binary files a/public/img/corporate_logos/fennovoima.png and /dev/null differ diff --git a/public/img/corporate_logos/fingrid.jpg b/public/img/corporate_logos/fingrid.jpg deleted file mode 100644 index bb9949d..0000000 Binary files a/public/img/corporate_logos/fingrid.jpg and /dev/null differ diff --git a/public/img/corporate_logos/nrcgroup.png b/public/img/corporate_logos/nrcgroup.png deleted file mode 100644 index 470e57b..0000000 Binary files a/public/img/corporate_logos/nrcgroup.png and /dev/null differ diff --git a/public/img/corporate_logos/okmetic.png b/public/img/corporate_logos/okmetic.png deleted file mode 100644 index bd442e3..0000000 Binary files a/public/img/corporate_logos/okmetic.png and /dev/null differ diff --git a/public/img/corporate_logos/sogeti.jpg b/public/img/corporate_logos/sogeti.jpg deleted file mode 100644 index 2983b77..0000000 Binary files a/public/img/corporate_logos/sogeti.jpg and /dev/null differ diff --git a/public/img/koydenveto-jani-mannonen-miika-koskela-17.jpg b/public/img/koydenveto-jani-mannonen-miika-koskela-17.jpg deleted file mode 100644 index 95b8ba0..0000000 Binary files a/public/img/koydenveto-jani-mannonen-miika-koskela-17.jpg and /dev/null differ diff --git a/public/img/koydenveto-jani-mannonen-miika-koskela-28.jpg b/public/img/koydenveto-jani-mannonen-miika-koskela-28.jpg deleted file mode 100644 index 45d51bf..0000000 Binary files a/public/img/koydenveto-jani-mannonen-miika-koskela-28.jpg and /dev/null differ diff --git a/public/img/koydenveto-jani-mannonen-miika-koskela-78.jpg b/public/img/koydenveto-jani-mannonen-miika-koskela-78.jpg deleted file mode 100644 index 26509ee..0000000 Binary files a/public/img/koydenveto-jani-mannonen-miika-koskela-78.jpg and /dev/null differ diff --git a/public/img/react_logo.svg b/public/img/react_logo.svg deleted file mode 100644 index 6b60c10..0000000 --- a/public/img/react_logo.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/public/img/wappusitsit-jani-mannonen-29.jpg b/public/img/wappusitsit-jani-mannonen-29.jpg deleted file mode 100644 index b08d75a..0000000 Binary files a/public/img/wappusitsit-jani-mannonen-29.jpg and /dev/null differ diff --git a/src/api/feedApi.ts b/src/api/feedApi.ts index 717d5c6..759462e 100644 --- a/src/api/feedApi.ts +++ b/src/api/feedApi.ts @@ -62,6 +62,20 @@ class FeedApi { throw err; } } + + static async deletePost(id: number) { + try { + const resp = await axios.delete(`${URL}${id}`, { + headers: { + Authorization: getAuthHeader(), + }, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } + } } export default FeedApi; diff --git a/src/api/jobAdApi.ts b/src/api/jobAdApi.ts index c28c5a0..a26c28d 100644 --- a/src/api/jobAdApi.ts +++ b/src/api/jobAdApi.ts @@ -72,6 +72,20 @@ class JobAdApi { throw err; } } + + static async deleteJobAd(id: number) { + try { + const resp = await axios.delete(`${URL}${id}`, { + headers: { + Authorization: getAuthHeader(), + }, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } + } } export default JobAdApi; diff --git a/src/components/CommitteeContainer.tsx b/src/components/CommitteeContainer.tsx deleted file mode 100644 index 638e71f..0000000 --- a/src/components/CommitteeContainer.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import React from "react"; -import styled from "styled-components"; -import { Committee } from "@views/ContactsPage/ContactsPageView"; -import { colors } from "@theme/colors"; -import ContactCard from "./ContactCard"; - -const blank_profile = "/img/blank_profile.png"; - -interface CommitteeContainerProps { - committee: Committee; -} - -const Container = styled.div` - display: flex; - flex-direction: column; - align-items: center; - justify-content: flex-start; - color: ${colors.darkBlue}; - - & > p { - display: flex; - justify-content: center; - text-transform: uppercase; - letter-spacing: 3px; - line-height: 0.75; - font-weight: bold; - } - - & > div { - display: flex; - flex-flow: row wrap; - justify-content: center; - } -`; - -const CommitteeContainer: React.FC = ({ committee }) => ( - -

- {committee.name_fi || committee.name_en} -

-
- {committee.roles.map((role) => ( - role.representatives.map((representative) => ( - - )) - ))} -
-
-); - -export default CommitteeContainer; diff --git a/src/components/ContactCard.tsx b/src/components/ContactCard.tsx index a2a465f..1262c3f 100644 --- a/src/components/ContactCard.tsx +++ b/src/components/ContactCard.tsx @@ -5,21 +5,22 @@ import { colors } from "@theme/colors"; const Card = styled.article` display: flex; - align-items: flex-start; - flex-flow: row nowrap; + justify-content: space-between; + flex: 1 0 50%; padding: 0.5rem; color: ${colors.darkBlue}; - width: 19rem; +`; + +const Row = styled.div` + display: flex; + flex-flow: row nowrap; `; const ImageContainer = styled.div` position: relative; - display: flex; - flex-shrink: 0; - justify-content: center; - align-items: center; height: 5rem; width: 5rem; + flex-shrink: 0; img { padding: 0.5rem !important; @@ -39,7 +40,7 @@ const Info = styled.div` margin: 0; } - & > h1 { + & > h3 { font-size: 0.9rem; font-weight: 500; } @@ -58,22 +59,24 @@ const ContactCard: React.FC = ({ name, phone, email, image, role_fi, role_en, }) => ( - {image ? ( - - {name} - - ) : null} - -

{name}

-

{role_fi || role_en}

- {phone ?

{phone}

: null} - {email ?

{email}

: null} -
+ + {image ? ( + + {name} + + ) : null} + +

{name}

+

{role_fi || role_en}

+ {phone ?

{phone}

: null} + {email ?

{email}

: null} +
+
); diff --git a/src/components/CrossFadeImages.tsx b/src/components/CrossFadeImages.tsx index 63a3a73..3be53b2 100644 --- a/src/components/CrossFadeImages.tsx +++ b/src/components/CrossFadeImages.tsx @@ -69,7 +69,7 @@ const CrossFadeImages: React.FC = ({ $duration={len * SINGLE_IMAGE_TIME} > { images.map((image, idx) => ( -
0 ? "not-first" : undefined}> +
0 ? "not-first" : undefined}> ( + ); diff --git a/src/pages/admin/events/[id].tsx b/src/pages/admin/events/[id].tsx index 48b2ba3..86ed479 100644 --- a/src/pages/admin/events/[id].tsx +++ b/src/pages/admin/events/[id].tsx @@ -1,6 +1,7 @@ import React, { useEffect, useState } from "react"; import { NextPage } from "next"; import { useRouter } from "next/router"; +import { toast } from "react-toastify"; import AdminCreateCommon from "@views/admin/AdminCreateCommon"; import Tag from "@models/Tag"; import TagApi from "@api/tagApi"; @@ -66,6 +67,7 @@ const buildSchema = (formData: Event, signupForms: SignupForm[], tags: Tag[]) => enumNames: signupForms.map((form) => form.title_fi), }, uniqueItems: true, + default: [], }, image: { type: ["string", "null"], @@ -166,7 +168,6 @@ const EventCreatePage: NextPage = () => { const [tags, setTags] = useState([]); const [signupForms, setSignupForms] = useState([]); const [error, setError] = useState(null); - const [statusMessage, setStatusMessage] = useState(null); const router = useRouter(); @@ -212,7 +213,8 @@ const EventCreatePage: NextPage = () => { // resp.signupForm = (resp.signupForm as any).map(inst => inst.id); resp.tags = data.formData.tags; resp.signupForm = data.formData.signupForm; - setStatusMessage("Event created successfully"); + toast.success("Event created successfully 😎"); + router.push("/admin/events"); setFormData(resp); } else { const resp = await EventApi.updateEvent(payload); @@ -222,16 +224,17 @@ const EventCreatePage: NextPage = () => { // resp.signupForm = (resp.signupForm as any).map(inst => inst.id); resp.tags = data.formData.tags; resp.signupForm = data.formData.signupForm; - setStatusMessage("Event updated successfully"); + toast.success("Event updated successfully 😎"); + router.push("/admin/events"); setFormData(resp); } } catch (err) { + toast.error("Uh oh! Something went wrong! Try again later. 😟"); setError(err); } }; const onChange = (data: any) => setFormData(data.formData); - const onFocus = () => setStatusMessage(null); const title = formData?.id ? `Edit Event "${formData.title_fi}"` : "Create Event"; @@ -243,9 +246,7 @@ const EventCreatePage: NextPage = () => { schema={buildSchema(formData, signupForms, tags)} UISchema={buildUISchema()} onChange={onChange} - onFocus={onFocus} onSubmit={onSubmit} - statusMessage={statusMessage} error={error} widgets={widgets} /> diff --git a/src/pages/admin/events/index.tsx b/src/pages/admin/events/index.tsx index e77d5d8..edfc3f4 100644 --- a/src/pages/admin/events/index.tsx +++ b/src/pages/admin/events/index.tsx @@ -1,14 +1,37 @@ import React from "react"; import { NextPage } from "next"; import { formatRelative } from "date-fns"; +import { toast } from "react-toastify"; +import styled from "styled-components"; import AdminListCommon from "@views/admin/AdminListCommon"; -import { Link } from "@components/index"; +import { Button, Link } from "@components/index"; import AddLink from "@components/AddLink"; import Event from "@models/Event"; +import EventApi from "@api/eventApi"; import useFetchEvents from "@hooks/useFetchEvents"; const URL = "/admin/events"; +const StyledButton = styled(Button) <{ $colorOverride: "red" }>` + background-color: ${(p) => p.$colorOverride}; + border-radius: 8px; + color: white; + font-size: 13px; + font-weight: bold; +`; + +const confirmDelete = async (event: Event) => { + if (window.confirm(`Delete: ${event.id}: ${event.title_fi}/${event.title_en}; Are you sure?`) === true) { + try { + await EventApi.deleteEvent(event.id); + toast.success("Event removed successfully 😎"); + window.location.reload(); // TODO: Fetch/update event list, so user sees the signup in the list + } catch (err) { + toast.error("Uh oh! Something went wrong! Try again later. 😟"); + } + } +}; + const renderData = (events: Event[]) => { if (!events || events.length === 0) { return
No events.
; @@ -29,12 +52,18 @@ const renderData = (events: Event[]) => { {event.title_fi} {formatRelative(new Date(event.start_time), new Date())} {formatRelative(new Date(event.end_time), new Date())} + + confirmDelete(event)}> + Delete + + ))} ); }; + const AdminEventPage: NextPage = () => { const { data } = useFetchEvents({ options: { auth: true } }); return ( diff --git a/src/pages/admin/feed/[id].tsx b/src/pages/admin/feed/[id].tsx index e4dfcf5..43c4707 100644 --- a/src/pages/admin/feed/[id].tsx +++ b/src/pages/admin/feed/[id].tsx @@ -9,6 +9,7 @@ import FeedApi from "@api/feedApi"; import DatetimeWidget from "@components/Widgets/DatetimeWidget"; import SectionDividerWidget from "@components/Widgets/SectionDividerWidget"; import MarkdownEditorWidget from "@components/Widgets/MarkdownEditorWidget"; +import { toast } from "react-toastify"; const widgets = { datetime: DatetimeWidget, @@ -133,7 +134,6 @@ const FeedCreatePage: NextPage = () => { const [formData, setFormData] = useState(null); const [tags, setTags] = useState([]); const [error, setError] = useState(null); - const [statusMessage, setStatusMessage] = useState(null); const router = useRouter(); @@ -167,21 +167,23 @@ const FeedCreatePage: NextPage = () => { if (payload.id === undefined) { const resp = await FeedApi.createPost(payload); // resp.tags = resp.tags; - setStatusMessage("Post created successfully"); + toast.success("Post created successfully 😎"); + router.push("/admin/feed"); setFormData(resp); } else { const resp = await FeedApi.updatePost(payload); // resp.tags = resp.tag_id; - setStatusMessage("Post updated successfully"); + toast.success("Post updated successfully 😎"); + router.push("/admin/feed"); setFormData(resp); } } catch (err) { + toast.error("Uh oh! Something went wrong! Try again later. 😟"); setError(err); } }; const onChange = (data) => setFormData(data.formData); - const onFocus = () => setStatusMessage(null); const title = formData?.id ? `Edit Post "${formData.title_fi}"` @@ -194,9 +196,7 @@ const FeedCreatePage: NextPage = () => { schema={buildSchema(formData, tags)} UISchema={buildUISchema(formData)} onChange={onChange} - onFocus={onFocus} onSubmit={onSubmit} - statusMessage={statusMessage} error={error} widgets={widgets} /> diff --git a/src/pages/admin/feed/index.tsx b/src/pages/admin/feed/index.tsx index 757ed1e..793f27b 100644 --- a/src/pages/admin/feed/index.tsx +++ b/src/pages/admin/feed/index.tsx @@ -1,14 +1,37 @@ import React from "react"; import { NextPage } from "next"; import { formatRelative } from "date-fns"; +import { toast } from "react-toastify"; +import styled from "styled-components"; import AdminListCommon from "@views/admin/AdminListCommon"; -import { Link } from "@components/index"; +import { Button, Link } from "@components/index"; import AddLink from "@components/AddLink"; import Post from "@models/Feed"; +import PostApi from "@api/feedApi"; import useFetchFeed from "@hooks/useFetchFeed"; const URL = "/admin/feed"; +const StyledButton = styled(Button) <{ $colorOverride: "red" }>` + background-color: ${(p) => p.$colorOverride}; + border-radius: 8px; + color: white; + font-size: 13px; + font-weight: bold; +`; + +const confirmDelete = async (post: Post) => { + if (window.confirm(`Delete: ${post.id}: ${post.title_fi}/${post.title_en}; Are you sure?`) === true) { + try { + await PostApi.deletePost(post.id); + toast.success("Post removed successfully 😎"); + window.location.reload(); // TODO: Fetch/update post list, so user sees the signup in the list + } catch (err) { + toast.error("Uh oh! Something went wrong! Try again later. 😟"); + } + } +}; + const renderData = (feed: Post[]) => { if (!feed || feed.length === 0) { return
No posts.
; @@ -29,6 +52,11 @@ const renderData = (feed: Post[]) => { {post.title_fi} {post.description_fi} {formatRelative(new Date(post.publish_time), new Date())} + + confirmDelete(post)}> + Delete + + ))} diff --git a/src/pages/admin/jobads/[id].tsx b/src/pages/admin/jobads/[id].tsx index 3ecdaa0..4d456fa 100644 --- a/src/pages/admin/jobads/[id].tsx +++ b/src/pages/admin/jobads/[id].tsx @@ -7,6 +7,7 @@ import JobAdApi from "@api/jobAdApi"; import DatetimeWidget from "@components/Widgets/DatetimeWidget"; import SectionDividerWidget from "@components/Widgets/SectionDividerWidget"; import MarkdownEditorWidget from "@components/Widgets/MarkdownEditorWidget"; +import { toast } from "react-toastify"; const widgets = { datetime: DatetimeWidget, @@ -108,7 +109,6 @@ const buildUISchema = (formData: JobAd) => ({ const JobAdCreatePage: NextPage = () => { const [formData, setFormData] = useState(null); const [error, setError] = useState(null); - const [statusMessage, setStatusMessage] = useState(null); const router = useRouter(); @@ -132,20 +132,22 @@ const JobAdCreatePage: NextPage = () => { const payload = data.formData; if (payload.id === undefined) { const resp = await JobAdApi.createJobAd(payload); - setStatusMessage("Post created successfully"); + toast.success("Job ad created successfully 😎"); + router.push("/admin/jobads"); setFormData(resp); } else { const resp = await JobAdApi.updateJobAd(payload); - setStatusMessage("Post updated successfully"); + toast.success("Job ad updated successfully 😎"); + router.push("/admin/jobads"); setFormData(resp); } } catch (err) { + toast.error("Uh oh! Something went wrong! Try again later. 😟"); setError(err); } }; const onChange = (data) => setFormData(data.formData); - const onFocus = () => setStatusMessage(null); const title = formData?.id ? `Edit Ad "${formData.title_fi}"` @@ -158,9 +160,7 @@ const JobAdCreatePage: NextPage = () => { schema={buildSchema(formData)} UISchema={buildUISchema(formData)} onChange={onChange} - onFocus={onFocus} onSubmit={onSubmit} - statusMessage={statusMessage} error={error} widgets={widgets} /> diff --git a/src/pages/admin/jobads/index.tsx b/src/pages/admin/jobads/index.tsx index 9500a38..cc6e7fa 100644 --- a/src/pages/admin/jobads/index.tsx +++ b/src/pages/admin/jobads/index.tsx @@ -1,14 +1,37 @@ import React from "react"; import { NextPage } from "next"; import { formatRelative } from "date-fns"; +import { toast } from "react-toastify"; +import styled from "styled-components"; import AdminListCommon from "@views/admin/AdminListCommon"; -import { Link } from "@components/index"; +import { Button, Link } from "@components/index"; import AddLink from "@components/AddLink"; import JobAd from "@models/JobAd"; import useFetchJobAds from "@hooks/useFetchJobAds"; +import JobAdApi from "@api/jobAdApi"; const URL = "/admin/jobads"; +const StyledButton = styled(Button) <{ $colorOverride: "red" }>` + background-color: ${(p) => p.$colorOverride}; + border-radius: 8px; + color: white; + font-size: 13px; + font-weight: bold; +`; + +const confirmDelete = async (jobad: JobAd) => { + if (window.confirm(`Delete: ${jobad.id}: ${jobad.title_fi}/${jobad.title_en}; Are you sure?`) === true) { + try { + await JobAdApi.deleteJobAd(jobad.id); + toast.success("Job ad removed successfully 😎"); + window.location.reload(); // TODO: Fetch/update event list, so user sees the signup in the list + } catch (err) { + toast.error("Uh oh! Something went wrong! Try again later. 😟"); + } + } +}; + const renderData = (jobAds: JobAd[]) => { if (!jobAds || jobAds.length === 0) { return
No advertisements.
; @@ -33,6 +56,11 @@ const renderData = (jobAds: JobAd[]) => { ? formatRelative(new Date(ad.autohide_at), new Date()) : "Disabled"} + + confirmDelete(ad)}> + Delete + + ))} diff --git a/src/pages/admin/signups/[id].tsx b/src/pages/admin/signups/[id].tsx index 73bac5b..c47f982 100644 --- a/src/pages/admin/signups/[id].tsx +++ b/src/pages/admin/signups/[id].tsx @@ -8,6 +8,7 @@ import DatetimeWidget from "@components/Widgets/DatetimeWidget"; import SignupQuestionsWidget from "@components/Widgets/SignupQuestionsWidget/SignupQuestionsWidget"; import MarkdownEditorWidget from "@components/Widgets/MarkdownEditorWidget"; import { buildValidationSchema } from "@views/SignUpPage/FormUtils"; +import { toast } from "react-toastify"; const DEFAULT_EMAIL = `Moikka, @@ -98,7 +99,6 @@ const buildUISchema = () => { const SignupCreatePage: NextPage = () => { const [formData, setFormData] = useState(null); const [error, setError] = useState(null); - const [statusMessage, setStatusMessage] = useState(null); const router = useRouter(); @@ -133,26 +133,28 @@ const SignupCreatePage: NextPage = () => { if (payload.id === undefined) { const resp = await SignupApi.createForm(payload); - setStatusMessage("Sign-up created successfully"); + toast.success("Sign-up created successfully 😎"); + router.push("/admin/signups"); setFormData({ ...resp, questions: JSON.stringify(resp.questions) as any, }); } else { const resp = await SignupApi.updateForm(payload); - setStatusMessage("Sign-up updated successfully"); + toast.success("Sign-up updated successfully 😎"); + router.push("/admin/signups"); setFormData({ ...resp, questions: JSON.stringify(resp.questions) as any, }); } } catch (err) { + toast.error("Uh oh! Something went wrong! Try again later. 😟"); setError(err); } }; const onChange = (data) => setFormData(data.formData); - const onFocus = () => setStatusMessage(null); const title = formData?.id ? `Edit Sign-up Form "${formData.title_fi}"` @@ -166,9 +168,7 @@ const SignupCreatePage: NextPage = () => { schema={buildSchema(formData)} UISchema={buildUISchema()} onChange={onChange} - onFocus={onFocus} onSubmit={onSubmit} - statusMessage={statusMessage} error={error} widgets={widgets} /> diff --git a/src/pages/admin/signups/[id]/email.tsx b/src/pages/admin/signups/[id]/email.tsx index 13e56d5..4bdd856 100644 --- a/src/pages/admin/signups/[id]/email.tsx +++ b/src/pages/admin/signups/[id]/email.tsx @@ -1,6 +1,7 @@ import React, { useEffect, useState } from "react"; import { NextPage } from "next"; import { useRouter } from "next/router"; +import { toast } from "react-toastify"; import AdminCreateCommon from "@views/admin/AdminCreateCommon"; import MarkdownEditorWidget from "@components/Widgets/MarkdownEditorWidget"; import { SignupForm } from "@models/Signup"; @@ -63,33 +64,26 @@ const SignupEmailPage: NextPage = () => { const signupForm = useInitializeData(id as string); const [error, setError] = useState(null); - const [statusMessage, setStatusMessage] = useState(null); const onSubmit = async (data) => { try { const payload = data.formData; await SignupApi.signupFormSendEmail(payload, Number(id)); - setStatusMessage("Email sent successfully"); + toast.success("Email sent successfully 😎"); } catch (err) { setError(err); + toast.error("Uh oh! Something went wrong! Try again later. 😟"); } }; - // const onChange = (data) => setFormData(data.formData); - const onFocus = () => setStatusMessage(null); - const title = signupForm ? signupForm.title_fi : "Loading..."; return ( diff --git a/src/pages/admin/signups/[id]/list.tsx b/src/pages/admin/signups/[id]/list.tsx index 4af8344..754a8c0 100644 --- a/src/pages/admin/signups/[id]/list.tsx +++ b/src/pages/admin/signups/[id]/list.tsx @@ -1,6 +1,7 @@ import React, { useEffect, useState } from "react"; import { NextPage } from "next"; import { useRouter } from "next/router"; +import { toast } from "react-toastify"; import styled from "styled-components"; import { CSVLink } from "react-csv"; import AdminListCommon from "@views/admin/AdminListCommon"; @@ -11,6 +12,10 @@ import noop from "@utils/noop"; const StyledButton = styled(Button) <{ $colorOverride: "red" | "green" }>` background-color: ${(p) => p.$colorOverride}; + border-radius: 8px; + color: white; + font-size: 13px; + font-weight: bold; `; const SignupEmailPage: NextPage = () => { @@ -33,8 +38,9 @@ const SignupEmailPage: NextPage = () => { try { await SignupApi.deleteSignup(signup.id); setSignups(signups.filter((s) => s.id !== signup.id)); + toast.success("Signup removed successfully 😎"); } catch (err) { - window.alert("Delete failed!"); + toast.error("Uh oh! Something went wrong! Try again later. 😟"); } } }; diff --git a/src/pages/admin/signups/index.tsx b/src/pages/admin/signups/index.tsx index 84e199a..6c4b762 100644 --- a/src/pages/admin/signups/index.tsx +++ b/src/pages/admin/signups/index.tsx @@ -1,14 +1,36 @@ import React, { useEffect, useState } from "react"; import { NextPage } from "next"; import { formatRelative } from "date-fns"; +import { toast } from "react-toastify"; +import styled from "styled-components"; import AdminListCommon from "@views/admin/AdminListCommon"; -import { Link } from "@components/index"; +import { Button, Link } from "@components/index"; import AddLink from "@components/AddLink"; import { SignupForm } from "@models/Signup"; import SignupApi from "@api/signupApi"; const URL = "/admin/signups"; +const StyledButton = styled(Button) <{ $colorOverride: "red" }>` + background-color: ${(p) => p.$colorOverride}; + border-radius: 8px; + color: white; + font-size: 13px; + font-weight: bold; +`; + +const confirmDelete = async (signup: SignupForm) => { + if (window.confirm(`Delete: ${signup.id}: ${signup.title_fi}/${signup.title_en}; Are you sure?`) === true) { + try { + await SignupApi.deleteForm(signup.id); + toast.success("Signup removed successfully 😎"); + window.location.reload(); // TODO: Fetch/update event list, so user sees the signup in the list + } catch (err) { + toast.error("Uh oh! Something went wrong! Try again later. 😟"); + } + } +}; + const renderData = (signupForms: SignupForm[]) => { if (!signupForms || signupForms.length === 0) { return
No signup forms.
; @@ -33,6 +55,11 @@ const renderData = (signupForms: SignupForm[]) => { {formatRelative(new Date(signupForm.end_time), new Date())} View Send + + confirmDelete(signupForm)}> + Delete + + ))} diff --git a/src/pages/events/[id].tsx b/src/pages/events/[id].tsx index 1dbcaf1..082f721 100644 --- a/src/pages/events/[id].tsx +++ b/src/pages/events/[id].tsx @@ -8,6 +8,7 @@ import useFetchEvents from "@hooks/useFetchEvents"; import EventPageView from "@views/EventPage/EventPageView"; import PageWrapper from "@views/common/PageWrapper"; import LoadingView from "@views/common/LoadingView"; +import NotFoundPage from "@pages/404"; interface InitialProps { initialEvent: Event; @@ -20,7 +21,13 @@ const EventPage: NextPage = ({ initialEvent }) => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const { data, error } = useFetchEvents({ initialData: initialEvent, id: id as string }); - if (!data || router.isFallback) return ; + if (router.isFallback) return ; + + if (!data) { + return ( + + ); + } return ( <> @@ -50,12 +57,19 @@ export const getStaticPaths: GetStaticPaths = async () => { export const getStaticProps: GetStaticProps = async ({ params }) => { const { id } = params; - const initialEvent = await EventApi.getEvent(Number(id)); + let notFound = false; + let initialEvent: Event; + try { + initialEvent = await EventApi.getEvent(Number(id)); + } catch (err) { + notFound = true; + } return { props: { initialEvent, }, revalidate: 10, + notFound, }; }; diff --git a/src/pages/feed/[id].tsx b/src/pages/feed/[id].tsx index e184bb3..1b42300 100644 --- a/src/pages/feed/[id].tsx +++ b/src/pages/feed/[id].tsx @@ -8,6 +8,7 @@ import useFetchFeed from "@hooks/useFetchFeed"; import FeedPageView from "@views/FeedPage/FeedPageView"; import PageWrapper from "@views/common/PageWrapper"; import LoadingView from "@views/common/LoadingView"; +import NotFoundPage from "@pages/404"; interface InitialProps { initialPost: Post; @@ -20,7 +21,13 @@ const FeedPage: NextPage = ({ initialPost }) => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const { data, error } = useFetchFeed({ initialData: initialPost, id: id as string }); - if (!data || router.isFallback) return ; + if (router.isFallback) return ; + + if (!data) { + return ( + + ); + } return ( <> @@ -50,12 +57,20 @@ export const getStaticPaths: GetStaticPaths = async () => { export const getStaticProps: GetStaticProps = async ({ params }) => { const { id } = params; - const initialPost = await FeedApi.getPost(Number(id)); + let notFound = false; + let initialPost: Post; + try { + initialPost = await FeedApi.getPost(Number(id)); + } catch (err) { + notFound = true; + } + return { props: { initialPost, }, revalidate: 10, + notFound, }; }; diff --git a/src/pages/signup/[id].tsx b/src/pages/signup/[id].tsx index fc379d1..ac9070c 100644 --- a/src/pages/signup/[id].tsx +++ b/src/pages/signup/[id].tsx @@ -1,13 +1,15 @@ -import React, { useState } from "react"; +import React from "react"; import { NextPage, GetStaticProps, GetStaticPaths } from "next"; import Head from "next/head"; import { useRouter } from "next/router"; +import { toast } from "react-toastify"; import { Signup, SignupForm } from "@models/Signup"; import SignupApi from "@api/signupApi"; import SignUpPageView from "@views/SignUpPage/SignUpPageView"; import PageWrapper from "@views/common/PageWrapper"; import LoadingView from "@views/common/LoadingView"; import noop from "@utils/noop"; +import NotFoundPage from "@pages/404"; type InitialProps = { form: SignupForm; @@ -15,12 +17,17 @@ type InitialProps = { const SignUpPage: NextPage = ({ form }) => { const router = useRouter(); - const [statusMessage, setStatus] = useState(null); if (router.isFallback) { return ; } + if (!form) { + return ( + + ); + } + const onSubmit = async (data) => { const payload: Signup = { signupForm_id: form.id, @@ -29,11 +36,11 @@ const SignUpPage: NextPage = ({ form }) => { try { await SignupApi.createSignup(payload); - // TODO: Fetch/update signup list, so user sees the signup in the list - setStatus("Sign-up submitted successfully"); + toast.success("Sign-up submitted successfully 😎"); + router.push(window.location.href); // TODO: Fetch/update signup list, so user sees the signup in the list } catch (error) { console.error(error); - setStatus("Bad request"); + toast.error("Uh oh! Sign-up failed! 😟"); } }; @@ -46,7 +53,6 @@ const SignUpPage: NextPage = ({ form }) => { @@ -71,12 +77,19 @@ export const getStaticPaths: GetStaticPaths = async () => { export const getStaticProps: GetStaticProps = async ({ params }) => { const { id } = params; - const form = await SignupApi.getForm(Number(id)); + let notFound = false; + let form: SignupForm; + try { + form = await SignupApi.getForm(Number(id)); + } catch { + notFound = true; + } return { props: { form, }, revalidate: 10, + notFound, }; }; diff --git a/src/pages/signup/edit/[id]/[uuid].tsx b/src/pages/signup/edit/[id]/[uuid].tsx index 6413d78..3b150a0 100644 --- a/src/pages/signup/edit/[id]/[uuid].tsx +++ b/src/pages/signup/edit/[id]/[uuid].tsx @@ -1,6 +1,7 @@ import React, { useEffect, useState } from "react"; import { NextPage } from "next"; import { useRouter } from "next/router"; +import { toast } from "react-toastify"; import { Signup, SignupForm } from "@models/Signup"; import SignupApi from "@api/signupApi"; import SignUpPageView from "@views/SignUpPage/SignUpPageView"; @@ -48,7 +49,6 @@ const useFetchSignup = (signupId: number, uuid: string) => { const EditSignUpPage: NextPage = () => { const router = useRouter(); const { signupId, uuid } = parseQueryParams(router.query); - const [statusMessage, setStatus] = useState(null); const [form, formData] = useFetchSignup(signupId, uuid); const onSubmit = async (data) => { @@ -61,10 +61,10 @@ const EditSignUpPage: NextPage = () => { try { await SignupApi.updateSignup(payload, uuid); // TODO: Update signup list, so user sees possible changes in the list - setStatus("Sign-up submission updated successfully"); + toast.success("Sign-up updated successfully 😎"); } catch (error) { console.error(error); - setStatus("Bad request"); + toast.error("Uh oh! Updating sign-up failed! 😟"); } }; @@ -73,7 +73,6 @@ const EditSignUpPage: NextPage = () => { diff --git a/src/views/ActualPage/ActualPageHero.tsx b/src/views/ActualPage/ActualPageHero.tsx index 422607d..e15ebe5 100644 --- a/src/views/ActualPage/ActualPageHero.tsx +++ b/src/views/ActualPage/ActualPageHero.tsx @@ -49,7 +49,6 @@ const ActualPageHero: React.FC = () => ( linkText="Yritysyhteistyö â€º" /> ( > - Killan hallitus päivystää kiltahuoneella maanantaisin klo 12.15–13.15. Tuolloin voit ostaa kiltatuotteita, kuten esim. haalarimerkkejä tai laulukirjoja. + Killan hallitus päivystää kiltahuoneella maanantaisin. Tuolloin voit ostaa kiltatuotteita, kuten esim. haalarimerkkejä tai laulukirjoja. - Kiltapäiväkerho Kiltis kokoontuu torstaisin klo XX.XX kiltahuoneella. Lorem ipsum dolor sit amet. Lämpimästi tervetuloa kaikki SIKkiläiset ja SIK-mieliset! + Kiltapäiväkerho Kiltis kokoontuu torstaisin kiltahuoneella.. Lämpimästi tervetuloa kaikki SIKkiläiset ja SIK-mieliset! diff --git a/src/views/ActualPage/ActualPageView.tsx b/src/views/ActualPage/ActualPageView.tsx index 027d461..b689c61 100644 --- a/src/views/ActualPage/ActualPageView.tsx +++ b/src/views/ActualPage/ActualPageView.tsx @@ -55,10 +55,10 @@ const ActualPageView: React.FC = ({ events, feed }) => ( presentationTime={5} fadeTime={1} images={[ - "/img/carousel_images/elecyykka-jani-mannonen-6.jpg", - "/img/carousel_images/koydenveto-jani-mannonen-miika-koskela-17.jpg", - "/img/carousel_images/koydenveto-jani-mannonen-miika-koskela-28.jpg", - "/img/carousel_images/koydenveto-jani-mannonen-miika-koskela-78.jpg", + "https://static.sahkoinsinoorikilta.fi/img/carousel_images/elecyykka-jani-mannonen-6.jpg", + "https://static.sahkoinsinoorikilta.fi/img/carousel_images/koydenveto-jani-mannonen-miika-koskela-17.jpg", + "https://static.sahkoinsinoorikilta.fi/img/carousel_images/koydenveto-jani-mannonen-miika-koskela-28.jpg", + "https://static.sahkoinsinoorikilta.fi/img/carousel_images/koydenveto-jani-mannonen-miika-koskela-78.jpg", ]} width={400} height={400} @@ -67,10 +67,10 @@ const ActualPageView: React.FC = ({ events, feed }) => ( presentationTime={5} fadeTime={1} images={[ - "/img/carousel_images/koydenveto-mikko-haapamaki-33.jpg", - "/img/carousel_images/Varaslahto2020-AinoSuomi-73.jpg", - "/img/carousel_images/varauksenpurku_2020_timitiira-80.jpg", - "/img/carousel_images/otatarhan-ajot-timi-tiira-172.jpg", + "https://static.sahkoinsinoorikilta.fi/img/carousel_images/koydenveto-mikko-haapamaki-33.jpg", + "https://static.sahkoinsinoorikilta.fi/img/carousel_images/Varaslahto2020-AinoSuomi-73.jpg", + "https://static.sahkoinsinoorikilta.fi/img/carousel_images/varauksenpurku_2020_timitiira-80.jpg", + "https://static.sahkoinsinoorikilta.fi/img/carousel_images/otatarhan-ajot-timi-tiira-172.jpg", ]} width={400} height={400} @@ -79,10 +79,10 @@ const ActualPageView: React.FC = ({ events, feed }) => ( presentationTime={5} fadeTime={1} images={[ - "/img/carousel_images/kokkarit_kiia_einola-0631.jpg", - "/img/carousel_images/pota-jatkot-essi-jukkala-29.jpg", - "/img/carousel_images/pota99-paajuhla-oskari-lahti-171.jpg", - "/img/carousel_images/wappusitsit-jani-mannonen-29.jpg", + "https://static.sahkoinsinoorikilta.fi/img/carousel_images/kokkarit_kiia_einola-0631.jpg", + "https://static.sahkoinsinoorikilta.fi/img/carousel_images/pota-jatkot-essi-jukkala-29.jpg", + "https://static.sahkoinsinoorikilta.fi/img/carousel_images/pota99-paajuhla-oskari-lahti-171.jpg", + "https://static.sahkoinsinoorikilta.fi/img/carousel_images/wappusitsit-jani-mannonen-29.jpg", ]} width={400} height={400} diff --git a/src/views/ContactsPage/ContactsPageView.tsx b/src/views/ContactsPage/ContactsPageView.tsx index 00235a8..770b178 100644 --- a/src/views/ContactsPage/ContactsPageView.tsx +++ b/src/views/ContactsPage/ContactsPageView.tsx @@ -1,8 +1,8 @@ import React from "react"; import styled from "styled-components"; -import CommitteeContainer from "@components/CommitteeContainer"; import { Divider, TextSection, Link } from "@components/index"; import { colors } from "@theme/colors"; +import ContactCard from "@components/ContactCard"; import BoardJson from "./board.json"; import HvtmkJson from "./hvtmk.json"; @@ -15,6 +15,8 @@ import TtmkJson from "./ttmk.json"; import UtmkJson from "./utmk.json"; import YtmkJson from "./ytmk.json"; +const blank_profile = "/img/blank_profile.png"; + const BlueLink = styled(Link)` color: ${colors.blue1}; @@ -23,19 +25,59 @@ const BlueLink = styled(Link)` } `; -export interface Committee { +const Container = styled.div` + color: ${colors.darkBlue}; + + & > h2 { + text-transform: uppercase; + width: 100%; + } + + & > div { + display: flex; + flex-flow: row wrap; + } +`; + +const CommitteeContainer: React.FC<{ + committee: Committee; +}> = ({ committee, children }) => ( + +

+ {committee.name_fi || committee.name_en} +

+
+ {committee.roles.map((role) => ( + role.representatives.map((representative) => ( + + )) + ))} +
+ {children} +
+); + +interface Committee { name_fi: string; name_en: string; roles: Array; } -export interface Role { +interface Role { name_fi: string; name_en: string; representatives: Array } -export interface Representative { +interface Representative { name: string; phone_number?: string; email?: string; @@ -45,6 +87,7 @@ export interface Representative { const ContactsPageView: React.FC = () => ( <> +

Yhteystiedot

Asiaa olisi, mutta kehen ottaa yhteyttä?
Tämä sivu yrittää valottaa sen oikean ihmisen puhelinnumeroa ja sähköpostiosoitetta. @@ -52,87 +95,68 @@ const ContactsPageView: React.FC = () => ( -

- +

{"Hallitukseen saa yhteyden lähettämällä sähköpostia "} hallitus@sahkoinsinoorikilta.fi

-
+
-
- -
+
-
- -
+
-
- -
+
-
- -
+
-
- -
+
-
- -
+
-
- -
+
-
- -
+
-
- -
+
diff --git a/src/views/ContactsPage/board.json b/src/views/ContactsPage/board.json index 60b8ff6..cebc94f 100644 --- a/src/views/ContactsPage/board.json +++ b/src/views/ContactsPage/board.json @@ -7,7 +7,8 @@ "name_en": "Chairman of the Board", "representatives": [ { - "name": "Johannes Ora" + "name": "Johannes Ora", + "image": "https://static.sahkoinsinoorikilta.fi/img/board/chairman.jpg" } ] }, @@ -19,7 +20,7 @@ "name": "Salla Lyytikäinen", "phone_number": null, "email": null, - "image": null + "image": "https://static.sahkoinsinoorikilta.fi/img/board/secretary.jpg" } ] }, @@ -31,7 +32,7 @@ "name": "Santeri Huhtala", "phone_number": null, "email": null, - "image": null + "image": "https://static.sahkoinsinoorikilta.fi/img/board/treasurer.jpg" } ] }, @@ -43,7 +44,7 @@ "name": "Toni Ojala", "phone_number": null, "email": null, - "image": null + "image": "https://static.sahkoinsinoorikilta.fi/img/board/captain1.jpg" } ] }, @@ -55,7 +56,7 @@ "name": "Toni Lyttinen", "phone_number": null, "email": null, - "image": null + "image": "https://static.sahkoinsinoorikilta.fi/img/board/captain2.jpg" } ] }, @@ -67,7 +68,7 @@ "name": "Eveliina Ahonen", "phone_number": null, "email": null, - "image": null + "image": "https://static.sahkoinsinoorikilta.fi/img/board/ceremonies.jpg" } ] }, @@ -79,7 +80,7 @@ "name": "Melisa Dönmez", "phone_number": null, "email": null, - "image": null + "image": "https://static.sahkoinsinoorikilta.fi/img/board/court_cancelor.jpg" } ] }, @@ -91,7 +92,7 @@ "name": "Heidi Mäkitalo", "phone_number": null, "email": null, - "image": null + "image": "https://static.sahkoinsinoorikilta.fi/img/board/isocoordinator.jpg" } ] }, @@ -103,7 +104,7 @@ "name": "Sauli Norja", "phone_number": null, "email": null, - "image": null + "image": "https://static.sahkoinsinoorikilta.fi/img/board/wellbeing.jpg" } ] }, @@ -115,7 +116,7 @@ "name": "Simo Hakanummi", "phone_number": null, "email": null, - "image": null + "image": "https://static.sahkoinsinoorikilta.fi/img/board/studies.jpg" } ] }, @@ -127,7 +128,7 @@ "name": "Oskari Ponkala", "phone_number": null, "email": null, - "image": null + "image": "https://static.sahkoinsinoorikilta.fi/img/board/technology.jpg" } ] }, @@ -139,7 +140,7 @@ "name": "Oliver Hiekkamies", "phone_number": null, "email": null, - "image": null + "image": "https://static.sahkoinsinoorikilta.fi/img/board/external.jpg" } ] }, @@ -151,7 +152,7 @@ "name": "Otto Julkunen", "phone_number": null, "email": null, - "image": null + "image": "https://static.sahkoinsinoorikilta.fi/img/board/corporate.jpg" } ] } diff --git a/src/views/EventPage/EventPageView.tsx b/src/views/EventPage/EventPageView.tsx index 343fc06..29ebba9 100644 --- a/src/views/EventPage/EventPageView.tsx +++ b/src/views/EventPage/EventPageView.tsx @@ -15,7 +15,6 @@ interface EventPageViewProps { } const StyledTextSection = styled(TextSection)` - margin: auto; align-items: center; & > h1 { @@ -24,6 +23,17 @@ const StyledTextSection = styled(TextSection)` color: ${colors.orange1}; } } + + & > div { + margin: auto; + + & > p { + font-size: 0.9rem; + font-weight: bold; + line-height: 0.4rem; + } + } + `; const SignupButtons = styled.div` @@ -38,6 +48,8 @@ const Content = styled(MarkdownStyles)` const EventPageView: React.FC = ({ event }) => { if (!event) return ; + const date_start = new Date(event.start_time).toLocaleString("fi-FI"); + const date_end = new Date(event.end_time).toLocaleString("fi-FI"); return (

@@ -48,13 +60,23 @@ const EventPageView: React.FC = ({ event }) => { {event.title_fi}

+

+ Paikka: {event.location_fi} +

+

+ +

+

+ +

{/* We may have multiple signup forms. Generate own Button for each one */} {event.signupForm.map((sf) => ( diff --git a/src/views/FrontPage/FrontPageView.tsx b/src/views/FrontPage/FrontPageView.tsx index 05d859a..87444f8 100644 --- a/src/views/FrontPage/FrontPageView.tsx +++ b/src/views/FrontPage/FrontPageView.tsx @@ -18,14 +18,14 @@ import noop from "@utils/noop"; import FrontPageHero from "./FrontPageHero"; // Corporate logos import -const ABB = "/img/corporate_logos/abb.png"; -const Caruna = "/img/corporate_logos/caruna.jpg"; -const Eaton = "/img/corporate_logos/eaton.png"; -const Ensto = "/img/corporate_logos/ensto.jpg"; -const eSett = "/img/corporate_logos/esett.png"; -const Fingrid = "/img/corporate_logos/fingrid.jpg"; -const NRCGroup = "/img/corporate_logos/nrcgroup.png"; -const Okmetic = "/img/corporate_logos/okmetic.png"; +const ABB = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/abb.jpg"; +const Caruna = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/caruna.jpg"; +const Eaton = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/eaton.jpg"; +const Ensto = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/ensto.jpg"; +const eSett = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/esett.jpg"; +const Fingrid = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/fingrid.jpg"; +const NRCGroup = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/nrcgroup.jpg"; +const Okmetic = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/okmetic.jpg"; interface FrontPageViewProps { events: Event[]; diff --git a/src/views/InEnglishPage/InEnglishPageView.tsx b/src/views/InEnglishPage/InEnglishPageView.tsx index d61a045..3fc4d5f 100644 --- a/src/views/InEnglishPage/InEnglishPageView.tsx +++ b/src/views/InEnglishPage/InEnglishPageView.tsx @@ -80,13 +80,10 @@ const InEnglishPageView: React.FC = ({ events, feed }) = presentationTime={5} fadeTime={1} images={[ - - "/img/carousel_images/in_english/ulkoexcursio1-kiia-einola-3.jpg", - "/img/carousel_images/in_english/international-sitsit-jani-mannonen-8.jpg", - "/img/carousel_images/in_english/ulkoexcursio-kiia-einola-16.jpg", - "/img/carousel_images/in_english/haalarigaala-jani-mannonen-1.jpg", - "/img/carousel_images/in_english/Kaukkarit-2020-Elias-Hirvonen-44.jpg", - "/img/carousel_images/in_english/koydenveto-jani-mannonen-miika-koskela-4.jpg", + "https://static.sahkoinsinoorikilta.fi/img/carousel_images/elecyykka-jani-mannonen-6.jpg", + "https://static.sahkoinsinoorikilta.fi/img/carousel_images/koydenveto-jani-mannonen-miika-koskela-17.jpg", + "https://static.sahkoinsinoorikilta.fi/img/carousel_images/koydenveto-jani-mannonen-miika-koskela-28.jpg", + "https://static.sahkoinsinoorikilta.fi/img/carousel_images/koydenveto-jani-mannonen-miika-koskela-78.jpg", ]} width={400} height={400} @@ -95,12 +92,10 @@ const InEnglishPageView: React.FC = ({ events, feed }) = presentationTime={5} fadeTime={1} images={[ - "/img/carousel_images/in_english/international-sitsit-jani-mannonen-8.jpg", - "/img/carousel_images/in_english/Kaukkarit-2020-Elias-Hirvonen-44.jpg", - "/img/carousel_images/in_english/koydenveto-jani-mannonen-miika-koskela-4.jpg", - "/img/carousel_images/in_english/ulkoexcursio-kiia-einola-16.jpg", - "/img/carousel_images/in_english/haalarigaala-jani-mannonen-1.jpg", - "/img/carousel_images/in_english/ulkoexcursio1-kiia-einola-3.jpg", + "https://static.sahkoinsinoorikilta.fi/img/carousel_images/koydenveto-mikko-haapamaki-33.jpg", + "https://static.sahkoinsinoorikilta.fi/img/carousel_images/Varaslahto2020-AinoSuomi-73.jpg", + "https://static.sahkoinsinoorikilta.fi/img/carousel_images/varauksenpurku_2020_timitiira-80.jpg", + "https://static.sahkoinsinoorikilta.fi/img/carousel_images/otatarhan-ajot-timi-tiira-172.jpg", ]} width={400} height={400} @@ -109,12 +104,10 @@ const InEnglishPageView: React.FC = ({ events, feed }) = presentationTime={5} fadeTime={1} images={[ - "/img/carousel_images/in_english/haalarigaala-jani-mannonen-1.jpg", - "/img/carousel_images/in_english/ulkoexcursio1-kiia-einola-3.jpg", - "/img/carousel_images/in_english/international-sitsit-jani-mannonen-8.jpg", - "/img/carousel_images/in_english/Kaukkarit-2020-Elias-Hirvonen-44.jpg", - "/img/carousel_images/in_english/koydenveto-jani-mannonen-miika-koskela-4.jpg", - "/img/carousel_images/in_english/ulkoexcursio-kiia-einola-16.jpg", + "https://static.sahkoinsinoorikilta.fi/img/carousel_images/kokkarit_kiia_einola-0631.jpg", + "https://static.sahkoinsinoorikilta.fi/img/carousel_images/pota-jatkot-essi-jukkala-29.jpg", + "https://static.sahkoinsinoorikilta.fi/img/carousel_images/pota99-paajuhla-oskari-lahti-171.jpg", + "https://static.sahkoinsinoorikilta.fi/img/carousel_images/wappusitsit-jani-mannonen-29.jpg", ]} width={400} height={400} @@ -145,8 +138,8 @@ const InEnglishPageView: React.FC = ({ events, feed }) = presentationTime={5} fadeTime={1} images={[ - "/img/carousel_images/in_english/tour/qtour1.jpg", - "/img/carousel_images/in_english/tour/qtour2.jpg", + "https://static.sahkoinsinoorikilta.fi/img/tour/qtour1.jpg", + "https://static.sahkoinsinoorikilta.fi/img/tour/qtour2.jpg", ]} width={400} height={400} @@ -155,8 +148,8 @@ const InEnglishPageView: React.FC = ({ events, feed }) = presentationTime={5} fadeTime={1} images={[ - "/img/carousel_images/in_english/tour/qtour3.jpg", - "/img/carousel_images/in_english/tour/qtour4.jpg", + "https://static.sahkoinsinoorikilta.fi/img/tour/qtour3.jpg", + "https://static.sahkoinsinoorikilta.fi/img/tour/qtour4.jpg", ]} width={400} height={400} @@ -165,8 +158,8 @@ const InEnglishPageView: React.FC = ({ events, feed }) = presentationTime={5} fadeTime={1} images={[ - "/img/carousel_images/in_english/tour/qtour5.jpg", - "/img/carousel_images/in_english/tour/qtour1.jpg", + "https://static.sahkoinsinoorikilta.fi/img/tour/qtour5.jpg", + "https://static.sahkoinsinoorikilta.fi/img/tour/qtour1.jpg", ]} width={400} height={400} diff --git a/src/views/SignUpPage/SignUpPageView.tsx b/src/views/SignUpPage/SignUpPageView.tsx index 51f6165..6ad2e53 100644 --- a/src/views/SignUpPage/SignUpPageView.tsx +++ b/src/views/SignUpPage/SignUpPageView.tsx @@ -18,22 +18,23 @@ const customWidgets = { interface SignUpPageViewProps { signUpForm: SignupForm; formData: any; - statusMessage: string; onChange: (e: IChangeEvent, es?: ErrorSchema) => unknown; onSubmit: (e: ISubmitEvent) => unknown; } const renderList = (signUpForm: SignupForm) => ( - <> -
- Ilmoittautuneet{signUpForm.quota > 0 && (` (${signUpForm.signups.length}/${signUpForm.quota})`)}: -
-
    - {signUpForm.signups.map((s, idx) => ( -
  1. signUpForm.quota ? "reserved" : ""}>{s}
  2. - ))} -
- + ); const StyledSection = styled(TextSection)` @@ -62,7 +63,6 @@ const StyledSection = styled(TextSection)` const SignUpPageView: React.FC = ({ signUpForm, formData, - statusMessage, onChange, onSubmit, }) => { @@ -83,11 +83,34 @@ const SignUpPageView: React.FC = ({ ); }; - const form = signUpForm ? renderForm() : ( - - ); + let form: JSX.Element; + let signups: JSX.Element = null; + const startTime = new Date(signUpForm?.start_time); + const endTime = new Date(signUpForm?.end_time); + + if (!signUpForm) { + // Show loader if in edit mode and form has not yet loaded. + // For normal signup page, form is always defined on this level. + form = ( + + ); + } else if (startTime > new Date()) { + form = ( + <> +

Ilmoittauminen ei ole vielä auennut!

+

Se aukeaa {startTime.toLocaleString("fi-FI")}.

+ + ); + } else if (new Date() > endTime) { + form = ( +

Ilmoittauminen on umpeutunut!

+ ); + signups = renderList(signUpForm); + } else { + form = renderForm(); + signups = renderList(signUpForm); + } - const signups = signUpForm && signUpForm.signups ? renderList(signUpForm) : null; return (

@@ -97,16 +120,9 @@ const SignUpPageView: React.FC = ({

- - {statusMessage} - {form}
- + {signups}
); }; diff --git a/src/views/admin/AdminCreateCommon.tsx b/src/views/admin/AdminCreateCommon.tsx index a7d4c21..e05b673 100644 --- a/src/views/admin/AdminCreateCommon.tsx +++ b/src/views/admin/AdminCreateCommon.tsx @@ -16,14 +16,6 @@ const Common = styled.div` } `; -const SuccessMsg = styled.p` - margin-bottom: 0.5rem; - border: 1px solid ${colors.green1}; - padding: 8px 16px; - color: ${colors.green1}; - display: inline-block; -`; - const ErrorMsg = styled.p` margin-bottom: 0.5rem; border: 1px solid ${colors.orange2}; @@ -44,9 +36,8 @@ type AdminCreateCommonProps = { [name: string]: unknown; }; onChange?: (e: IChangeEvent, es?: ErrorSchema) => unknown; - onFocus: (id: string, value: string | number | boolean) => void; + onFocus?: (id: string, value: string | number | boolean) => void; onSubmit: (e: ISubmitEvent) => unknown; - statusMessage: string; error: string; widgets: { [name: string]: any; @@ -61,7 +52,6 @@ const AdminCreateCommon: React.FC = ({ onChange, onFocus, onSubmit, - statusMessage, error, widgets, }) => { @@ -74,9 +64,6 @@ const AdminCreateCommon: React.FC = ({

{title}

- {statusMessage && ( - {statusMessage} - )} { // eslint-disable-next-line no-param-reassign t.fixtureCtx.eventId = parsed.id; - const statusMessage = Selector("[data-e2e=\"admin-form-status-message\"]"); + const statusMessage = Selector(".Toastify__toast-body"); await t .hover(statusMessage) .expect( statusMessage.innerText, - ).eql("Event created successfully"); + ).eql("Event created successfully 😎"); }); diff --git a/tests/testcafe/admin/create-signup.test.ts b/tests/testcafe/admin/create-signup.test.ts index fef1d5c..93be0ba 100644 --- a/tests/testcafe/admin/create-signup.test.ts +++ b/tests/testcafe/admin/create-signup.test.ts @@ -86,10 +86,10 @@ test("Logged in user can create signup", async (t) => { // eslint-disable-next-line no-param-reassign t.fixtureCtx.formId = parsed.id; - const statusMessage = Selector("[data-e2e=\"admin-form-status-message\"]"); + const statusMessage = Selector(".Toastify__toast-body"); await t .hover(statusMessage) .expect( statusMessage.innerText, - ).eql("Sign-up created successfully"); + ).eql("Sign-up created successfully 😎"); }); diff --git a/tests/testcafe/signupToEvent.test.ts b/tests/testcafe/signupToEvent.test.ts index 6b46274..78615a8 100644 --- a/tests/testcafe/signupToEvent.test.ts +++ b/tests/testcafe/signupToEvent.test.ts @@ -52,10 +52,10 @@ test("User signups to event from front page", async (t) => { await t.click(Selector("button").nth(-1)); - const statusMessage = Selector(".sign-up-statusmessage"); + const statusMessage = Selector(".Toastify__toast-body"); await t .hover(statusMessage) .expect( statusMessage.innerText, - ).eql("Sign-up submitted successfully"); + ).eql("Sign-up submitted successfully 😎"); });