diff --git a/package-lock.json b/package-lock.json index 8874d31a8ea255ec9c4b84e25dc7227f0d7ebcf1..aede478fa5583b0f1d4a70eb5148792455c64644 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5389,6 +5389,136 @@ } } }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "globals": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", + "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-config-airbnb": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.0.1.tgz", + "integrity": "sha512-hLb/ccvW4grVhvd6CT83bECacc+s4Z3/AEyWQdIT2KeTsG9dR7nx1gs7Iw4tDmGKozCNHFn4yZmRm3Tgy+XxyQ==", + "dev": true, + "requires": { + "eslint-config-airbnb-base": "^14.0.0", + "object.assign": "^4.1.0", + "object.entries": "^1.1.0" + } + }, + "eslint-config-airbnb-base": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.0.0.tgz", + "integrity": "sha512-2IDHobw97upExLmsebhtfoD3NAKhV4H0CJWP3Uprd/uk+cHuWYOczPVxQ8PxLFUAw7o3Th1RAU8u1DoUpr+cMA==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.7", + "object.assign": "^4.1.0", + "object.entries": "^1.1.0" + } + }, "eslint-config-react-app": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.1.0.tgz", @@ -5448,9 +5578,9 @@ } }, "eslint-plugin-flowtype": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-3.13.0.tgz", - "integrity": "sha512-bhewp36P+t7cEV0b6OdmoRWJCBYRiHFlqPZAG1oS3SF+Y0LQkeDvFSM4oxoxvczD1OdONCXMlJfQFiWLcV9urw==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-4.6.0.tgz", + "integrity": "sha512-W5hLjpFfZyZsXfo5anlu7HM970JBDqbEshAJUkeczP6BFCIfJXuiIBQXyberLRtOStT0OGPF8efeTbxlHk4LpQ==", "requires": { "lodash": "^4.17.15" } @@ -5577,6 +5707,17 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" }, + "espree": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", + "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "dev": true, + "requires": { + "acorn": "^7.1.0", + "acorn-jsx": "^5.1.0", + "eslint-visitor-keys": "^1.1.0" + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -8960,9 +9101,9 @@ } }, "jquery": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz", - "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==" + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", + "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" }, "js-levenshtein": { "version": "1.1.6", @@ -9997,9 +10138,9 @@ } }, "npm": { - "version": "6.13.6", - "resolved": "https://registry.npmjs.org/npm/-/npm-6.13.6.tgz", - "integrity": "sha512-NomC08kv7HIl1FOyLOe9Hp89kYsOsvx52huVIJ7i8hFW8Xp65lDwe/8wTIrh9q9SaQhA8hTrfXPh3BEL3TmMpw==", + "version": "6.13.7", + "resolved": "https://registry.npmjs.org/npm/-/npm-6.13.7.tgz", + "integrity": "sha512-X967EKTT407CvgrWFjXusnPh0VLERcmR9hZFSVgkEquOomZkvpwLJ5zrQ3qrG9SpPLKJE4bPLUu76exKQ4a3Cg==", "requires": { "JSONStream": "^1.3.5", "abbrev": "~1.1.1", @@ -10007,7 +10148,7 @@ "ansistyles": "~0.1.3", "aproba": "^2.0.0", "archy": "~1.0.0", - "bin-links": "^1.1.6", + "bin-links": "^1.1.7", "bluebird": "^3.5.5", "byte-size": "^5.0.1", "cacache": "^12.0.3", @@ -10050,7 +10191,7 @@ "libnpmorg": "^1.0.1", "libnpmsearch": "^2.0.2", "libnpmteam": "^1.0.2", - "libnpx": "^10.2.0", + "libnpx": "^10.2.2", "lock-verify": "^2.1.0", "lockfile": "^1.0.4", "lodash._baseindexof": "*", @@ -10069,7 +10210,7 @@ "mississippi": "^3.0.0", "mkdirp": "~0.5.1", "move-concurrently": "^1.0.1", - "node-gyp": "^5.0.5", + "node-gyp": "^5.0.7", "nopt": "~4.0.1", "normalize-package-data": "^2.5.0", "npm-audit-report": "^1.3.2", @@ -10266,7 +10407,7 @@ } }, "bin-links": { - "version": "1.1.6", + "version": "1.1.7", "bundled": true, "requires": { "bluebird": "^3.5.3", @@ -10746,7 +10887,7 @@ } }, "env-paths": { - "version": "1.0.0", + "version": "2.2.0", "bundled": true }, "err-code": { @@ -11049,7 +11190,7 @@ } }, "get-caller-file": { - "version": "1.0.2", + "version": "1.0.3", "bundled": true }, "get-stream": { @@ -11244,7 +11385,7 @@ } }, "invert-kv": { - "version": "1.0.0", + "version": "2.0.0", "bundled": true }, "ip": { @@ -11402,10 +11543,10 @@ "bundled": true }, "lcid": { - "version": "1.0.0", + "version": "2.0.0", "bundled": true, "requires": { - "invert-kv": "^1.0.0" + "invert-kv": "^2.0.0" } }, "libcipm": { @@ -11564,7 +11705,7 @@ } }, "libnpx": { - "version": "10.2.0", + "version": "10.2.2", "bundled": true, "requires": { "dotenv": "^5.0.1", @@ -11694,15 +11835,30 @@ "ssri": "^6.0.0" } }, + "map-age-cleaner": { + "version": "0.1.3", + "bundled": true, + "requires": { + "p-defer": "^1.0.0" + } + }, "meant": { "version": "1.0.1", "bundled": true }, "mem": { - "version": "1.1.0", + "version": "4.3.0", "bundled": true, "requires": { - "mimic-fn": "^1.0.0" + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "bundled": true + } } }, "mime-db": { @@ -11716,10 +11872,6 @@ "mime-db": "~1.35.0" } }, - "mimic-fn": { - "version": "1.2.0", - "bundled": true - }, "minimatch": { "version": "3.0.4", "bundled": true, @@ -11797,6 +11949,10 @@ "version": "0.0.7", "bundled": true }, + "nice-try": { + "version": "1.0.5", + "bundled": true + }, "node-fetch-npm": { "version": "2.0.2", "bundled": true, @@ -11807,33 +11963,20 @@ } }, "node-gyp": { - "version": "5.0.5", + "version": "5.0.7", "bundled": true, "requires": { - "env-paths": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.1.2", + "request": "^2.88.0", + "rimraf": "^2.6.3", + "semver": "^5.7.1", "tar": "^4.4.12", - "which": "1" - }, - "dependencies": { - "nopt": { - "version": "3.0.6", - "bundled": true, - "requires": { - "abbrev": "1" - } - }, - "semver": { - "version": "5.3.0", - "bundled": true - } + "which": "^1.3.1" } }, "nopt": { @@ -12027,12 +12170,38 @@ "bundled": true }, "os-locale": { - "version": "2.1.0", + "version": "3.1.0", "bundled": true, "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "bundled": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "bundled": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + } } }, "os-tmpdir": { @@ -12047,10 +12216,18 @@ "os-tmpdir": "^1.0.0" } }, + "p-defer": { + "version": "1.0.0", + "bundled": true + }, "p-finally": { "version": "1.0.0", "bundled": true }, + "p-is-promise": { + "version": "2.1.0", + "bundled": true + }, "p-limit": { "version": "1.2.0", "bundled": true, @@ -13025,14 +13202,14 @@ "bundled": true }, "yargs": { - "version": "11.0.0", + "version": "11.1.1", "bundled": true, "requires": { "cliui": "^4.0.0", "decamelize": "^1.1.1", "find-up": "^2.1.0", "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", + "os-locale": "^3.1.0", "require-directory": "^2.1.1", "require-main-filename": "^1.0.1", "set-blocking": "^2.0.0", @@ -15288,6 +15465,14 @@ "v8-compile-cache": "^2.0.3" } }, + "eslint-plugin-flowtype": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-3.13.0.tgz", + "integrity": "sha512-bhewp36P+t7cEV0b6OdmoRWJCBYRiHFlqPZAG1oS3SF+Y0LQkeDvFSM4oxoxvczD1OdONCXMlJfQFiWLcV9urw==", + "requires": { + "lodash": "^4.17.15" + } + }, "eslint-plugin-import": { "version": "2.18.2", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", @@ -16587,6 +16772,25 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } + } + }, "slick-carousel": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz", @@ -17256,6 +17460,37 @@ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", diff --git a/package.json b/package.json index f5c7a275309229cd8c013f8ec2af30ead518426f..3d26b6d609adb29c3559eb3d0ebe1daf04dbe47b 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,10 @@ "private": true, "dependencies": { "axios": "^0.19.2", + "eslint-plugin-flowtype": "^4.6.0", "http-proxy-middleware": "^0.20.0", "moment": "^2.24.0", - "npm": "^6.13.6", + "npm": "^6.13.7", "prop-types": "^15.7.2", "react": "^16.12.0", "react-datepicker": "^2.11.0", diff --git a/src/components/Header.js b/src/components/Header.js index b609a5a69979d45e9c3b3dbc5d49b8901af444c7..5cd5c209180b91ab9f794deaf01d6f9f8905e3b9 100644 --- a/src/components/Header.js +++ b/src/components/Header.js @@ -69,7 +69,7 @@ class Header extends Component { }; } // Fetch the userData-s - componentWillMount() { + UNSAFE_componentWillMount() { this.props.getUserData(); } @@ -106,7 +106,7 @@ class Header extends Component { <Icon name='angle down' size='large' /> </Menu.Item> } - position='center' + position='top center' > <Menu inverted secondary size='large'> {menuItems.map((item, i) => @@ -141,7 +141,7 @@ class Header extends Component { <Responsive maxWidth={599}> <Segment inverted textAlign='center' vertical> <Container> - <Menu inverted secondary size='big'> + <Menu inverted secondary size='large'> {/* kszk logo + home link */} <Menu.Item as={Link} to={menuItems[0].to}> {menuItems[0].prefix}{menuItems[0].text} @@ -153,12 +153,13 @@ class Header extends Component { <Icon name='bars' size='large' /> </Menu.Item> } - position='center' + position='top center' open={this.state.isOpen} onOpen={this.handleOpen} + on='click' size='huge' > - <Menu vertical inverted secondary size='big'> + <Menu vertical inverted secondary size='large'> {menuItems.map((item, i) => ((this.props.user.permission >= item.permissionLevel ||item.permissionLevel === 0) && i>0? diff --git a/src/components/forms/AddSolutionForm.js b/src/components/forms/AddSolutionForm.js index 8b73573e5dd996ce15e765769356ae1891c939c8..3f4587b39e053b3f1b740248041bac8a46afed87 100644 --- a/src/components/forms/AddSolutionForm.js +++ b/src/components/forms/AddSolutionForm.js @@ -4,7 +4,11 @@ import { connect } from 'react-redux'; import { addSolution, writeSolution, writeSolutionFile, addDocument, clearWrite } from '../../actions/homework'; import './Forms.css'; import ConfirmModal from '../forms/ConfirmModal'; -import { emptyMessage } from '../pages/Homework'; +import { customMessage } from '../pages/Homework'; +import { + getDocuments, + getSolutions, +} from '../../actions/homework'; const allowedFileTypes = [ 'image/jpeg', @@ -23,10 +27,12 @@ class AddSolutionForm extends Component { }; } + render() { const { - name, description, file, - } = this.props.newSolution; + name, description, file + } = this.props.newSolution + const task = this.props.taskid; const corrected = false; const accepted = false; @@ -34,6 +40,17 @@ class AddSolutionForm extends Component { const note = ''; const disabledText = 'A hatĂĄridĹ lejĂĄrt, tovĂĄbbi beadĂĄs nem lehetsĂŠges.'; + // const { + // studentFullName, studentId, taskTitle, taskSolutions, + // } = this.props; + // const taskSolutionsProfile = + // taskSolutions.filter(solution => solution.created_by === studentId); + // const relevantSolution = taskSolutionsProfile.slice(-1)[0]; + // const relevantDocuments = this.props.homeworks.documents.filter(document => + // document.solution === relevantSolution.id).filter(document => + // document.uploaded_by_name === studentFullName); + // const relevantDocument = relevantDocuments.slice(-1)[0]; + return ( <Modal open={this.state.showModal} @@ -42,7 +59,9 @@ class AddSolutionForm extends Component { trigger={ <button id='task' - onClick={() => { this.setState({ showModal: true }); }} + onClick={() => { + this.setState({ showModal: true }); + }} > <Icon name='external' /> {this.props.tasktitle} @@ -55,10 +74,10 @@ class AddSolutionForm extends Component { <Modal.Content> <Modal.Description style={{ marginBottom: '2em' }}> <Header as='h5'>Feladat leĂrĂĄsa:</Header> - {sentences.map(s => (<p>{s}</p>))} + {sentences.map(s => (<p key={Math.random()}>{s}</p>))} </Modal.Description> {this.props.disabled ? - emptyMessage(disabledText, undefined, undefined, this.props.disabled) : + customMessage(disabledText, undefined, undefined, this.props.disabled) : <Form> <Form.Field control={Input} @@ -154,5 +173,7 @@ export default connect(mapStateToProps, { writeSolution, writeSolutionFile, addDocument, + getDocuments, clearWrite, + getSolutions, })(AddSolutionForm); diff --git a/src/components/forms/SolutionDetailsForm.js b/src/components/forms/SolutionDetailsForm.js index 8e2279ccad1d0399b64a6443003864f92f077883..d3ecf235902d945f9951a8a7d9e5aa251f85bbaa 100644 --- a/src/components/forms/SolutionDetailsForm.js +++ b/src/components/forms/SolutionDetailsForm.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import { Modal, Button, Header, Icon, Divider } from 'semantic-ui-react'; import { connect } from 'react-redux'; import CorrectSolutionForm from './CorrectSolutionForm'; -import { emptyMessage } from '../pages/Homework'; +import { customMessage } from '../pages/Homework'; import './Forms.css'; import { getSolutions, @@ -43,7 +43,7 @@ class SolutionDetailsForm extends Component { } }); - const emptyStudentText = 'Nincs ilyen kĂŠpzĹdĹ jelenleg.'; + const noStudentText = 'Nincs ilyen kĂŠpzĹdĹ jelenleg.'; return ( <Modal @@ -73,7 +73,7 @@ class SolutionDetailsForm extends Component { <Divider /> <Header as='h3'>Nem ĂŠrkezett mĂŠg megoldĂĄs:</Header> {noSubmitStudents.length === 0 ? - emptyMessage(emptyStudentText) : + customMessage(noStudentText) : noSubmitStudents.map(student => ( <Button key={Math.random()} color='blue' style={{ marginRight: '1.5em', marginTop: '1.5em' }}>{student.full_name}</Button> )) @@ -81,7 +81,7 @@ class SolutionDetailsForm extends Component { <Divider /> <Header as='h3'>JavĂtĂĄsra vĂĄr (A nĂŠvre kattintva kijavĂthatĂł a megoldĂĄs):</Header> {waitForCorrectionStudents.length === 0 ? - emptyMessage(emptyStudentText) : + customMessage(noStudentText) : waitForCorrectionStudents.map(student => ( <CorrectSolutionForm key={Math.random()} @@ -97,7 +97,7 @@ class SolutionDetailsForm extends Component { <Divider /> <Header as='h3'>A megoldĂĄs nem elfogadhatĂł (A nĂŠvre kattintva mĂłdosĂthatĂł a javĂtĂĄs):</Header> {noAcceptStudents.length === 0 ? - emptyMessage(emptyStudentText) : + customMessage(noStudentText) : noAcceptStudents.map(student => ( <CorrectSolutionForm key={Math.random()} @@ -113,7 +113,7 @@ class SolutionDetailsForm extends Component { <Divider /> <Header as='h3'>Elfogadva (A nĂŠvre kattintva mĂłdosĂthatĂł a javĂtĂĄs):</Header> {acceptedStudents.length === 0 ? - emptyMessage(emptyStudentText) : + customMessage(noStudentText) : acceptedStudents.map(student => ( <CorrectSolutionForm key={Math.random()} diff --git a/src/components/pages/ApplicantProfile.js b/src/components/pages/ApplicantProfile.js index 535617c75f03d53c51b485bdf0578051c346a6df..913f609569416770827f76abbd0e99aa04c22d88 100644 --- a/src/components/pages/ApplicantProfile.js +++ b/src/components/pages/ApplicantProfile.js @@ -5,7 +5,7 @@ import { getSelectedProfile, setStatus } from '../../actions/statistics'; import ConfirmModal from '../forms/ConfirmModal'; class ApplicantProfile extends Component { - componentWillMount() { + UNSAFE_componentWillMount() { this.props.getSelectedProfile(this.props.match.params.id); } @@ -13,7 +13,7 @@ class ApplicantProfile extends Component { const { id, signed, role, full_name, nick, motivation_about, motivation_exercise, motivation_profession } = this.props.selectedProfile; return ( - <Container style={{ padding: '60px' }}> + <Container style={{ paddingTop: '3em', paddingBottom: '6em' }}> <Item> <Item.Content> <Container textAlign='center'> @@ -21,7 +21,7 @@ class ApplicantProfile extends Component { <Item.Meta>{nick}</Item.Meta> </Container> <Item.Description> - <Container textAlign='justified' style={{ padding: '30px' }}> + <Container textAlign='justified' style={{ padding: '1em' }}> <Header as='h3'>MagamrĂłl, eddigi tevĂŠkenysĂŠgem:</Header> <p>{motivation_about}</p> <Header as='h3'>Szakmai motivĂĄciĂł:</Header> @@ -29,7 +29,7 @@ class ApplicantProfile extends Component { <Header as='h3'>Feladatok megoldĂĄsa:</Header> <p>{motivation_exercise}</p> </Container> - <Container textAlign='center' style={{ padding: '20px' }}> + <Container textAlign='center' style={{ padding: '1em' }}> <Header as='h3'>StĂĄtusz:</Header> { signed ? <div> @@ -63,18 +63,18 @@ class ApplicantProfile extends Component { </Item> { signed && role !== 'Staff' ? <Container textAlign='center'> - <ConfirmModal + <ConfirmModal button={ - <Button + <Button color='green' >JelentkezĂŠs elfogadĂĄsa </Button>} text='elfogadod a jelentkezĂŠst' onAccept={() => this.props.setStatus(id, 'Student')} /> - <ConfirmModal + <ConfirmModal button={ - <Button + <Button color='red' >JelentkezĂŠs elutasĂtĂĄsa </Button>} diff --git a/src/components/pages/Applications.js b/src/components/pages/Applications.js index 50f0133a5d33f332284e5bb3b5bd0000631b6142..93e0b974f6a2acd5d76d043bd6f468cb7b35a069 100644 --- a/src/components/pages/Applications.js +++ b/src/components/pages/Applications.js @@ -6,7 +6,7 @@ import { getProfiles, setStatus } from '../../actions/statistics'; import ConfirmModal from '../forms/ConfirmModal'; class Applications extends Component { - componentWillMount() { + UNSAFE_componentWillMount() { this.props.getProfiles(); } diff --git a/src/components/pages/EventDetail.js b/src/components/pages/EventDetail.js index 05381b31aed3cfd6fb67773c9e1597e17e1aef2f..50e87621e44f549b25c1ea2cb9fac2c1478a3745 100644 --- a/src/components/pages/EventDetail.js +++ b/src/components/pages/EventDetail.js @@ -29,7 +29,7 @@ class EventDetail extends Component { }; } - componentWillMount() { + UNSAFE_componentWillMount() { this.props.getEventById(this.props.match.params.id); this.props.getTrainees(); this.props.getNotesByEvent(this.props.match.params.id); diff --git a/src/components/pages/Events.js b/src/components/pages/Events.js index 923def7560120af68fe04614aa553fb22c82abce..75cc7941bf20432363865e6814ef5489e1d61c94 100644 --- a/src/components/pages/Events.js +++ b/src/components/pages/Events.js @@ -7,7 +7,7 @@ import { getStaffEvents, deleteEvent } from '../../actions/statistics'; import AddEventForm from '../forms/AddEventForm'; class Events extends Component { - componentWillMount() { + UNSAFE_componentWillMount() { this.props.getStaffEvents(); } diff --git a/src/components/pages/Groups.js b/src/components/pages/Groups.js index 92122735a05517b66ea7ebeb3c6e4fba1175bd9a..f1251d1f2f699cfde9abd34020869667e59f62ac 100644 --- a/src/components/pages/Groups.js +++ b/src/components/pages/Groups.js @@ -8,7 +8,7 @@ import { getGroups } from '../../actions/groups'; class Groups extends Component { - componentWillMount() { + UNSAFE_componentWillMount() { this.props.getGroups() } diff --git a/src/components/pages/Homework.js b/src/components/pages/Homework.js index 2d85f283b3b72b35cb2217ec9a8069fe6ab9dbc5..6acd11ec415bf68ab33b4daa9071dda2945036df 100644 --- a/src/components/pages/Homework.js +++ b/src/components/pages/Homework.js @@ -25,6 +25,9 @@ import EditTaskForm from '../forms/EditTaskForm'; import InfoModal from '../forms/InfoModal'; import ConfirmModal from '../forms/ConfirmModal'; +// Display type for the Table Semantic UI component +// {icon} {text} - Displayed for the student for each Task +// {rowstyle} - Table row style (red text, yellow bg, ...) const displayTypes = { can_submit: { text: 'BeadhatĂł', @@ -53,7 +56,7 @@ const displayTypes = { }, }; -export const emptyMessage = (header, text, marginBottom, warning) => ( +export const customMessage = (header, text, marginBottom, warning) => ( <Message style={{ marginBottom }} icon={warning ? 'warning' : 'info'} @@ -71,11 +74,11 @@ class Homework extends Component { this.props.getSolutions(this.props.user.id); } + // Returns a table style for the given task getTaskDisplayStyle(task) { - const taskSolutions = this.props.homeworks.solutions.filter(solution => - solution.task === task.id) - .filter(solution => - solution.created_by === this.props.user.id); + const taskSolutions = this.props.homeworks.solutions.filter(solution => + solution.task === task.id).filter(solution => + solution.created_by === this.props.user.id); if (taskSolutions.length === 0) { if (moment().isBefore(task.deadline)) { @@ -96,15 +99,19 @@ class Homework extends Component { return 'accepted'; } + // Returns table rows for the tasks + // given parameters separates the active/inactive tasks and normal/staff users renderTaskList(active, staff) { const { user, homeworks } = this.props; const profileSolutions = homeworks.solutions.filter(solution => solution.created_by === user.id); + // Normal user if (!staff) { return homeworks.tasks .filter(task => moment().isBefore(task.deadline) === active) .map(task => ( + // Style <Table.Row key={task.id} warning={ @@ -117,6 +124,7 @@ class Homework extends Component { displayTypes[this.getTaskDisplayStyle(task)].rowstyle.negative } > + {/* Form component */} <Table.Cell> <AddSolutionForm taskid={task.id} @@ -126,9 +134,11 @@ class Homework extends Component { disabled={moment().isAfter(task.deadline)} /> </Table.Cell> + {/* Deadline Date */} <Table.Cell> {moment(task.deadline).format('YYYY. MM. DD. HH:mm')} </Table.Cell> + {/* Status (JavĂtĂĄsra vĂĄr, ...) */} <Table.Cell> <Icon name={displayTypes[this.getTaskDisplayStyle(task)].icon} />{' '} {displayTypes[this.getTaskDisplayStyle(task)].text} @@ -156,6 +166,8 @@ class Homework extends Component { )); } + // Staff + const deleteButton = ( <Button inverted @@ -181,6 +193,7 @@ class Homework extends Component { displayTypes[this.getTaskDisplayStyle(task)].rowstyle.negative } > + {/* Form */} <Table.Cell> <SolutionDetailsForm taskid={task.id} @@ -188,9 +201,11 @@ class Homework extends Component { taskdesc={task.text} /> </Table.Cell> + {/* Deadline Date */} <Table.Cell> {moment(task.deadline).format('YYYY. MM. DD. HH:mm')} </Table.Cell> + {/* Admin buttons */} <Table.Cell> <EditTaskForm onClick={() => this.props.setSelectedTask(task)} /> <ConfirmModal @@ -203,6 +218,7 @@ class Homework extends Component { )); } + // Active/Inactive tasks table renderHomeworksTable(active, staff) { let tableColor = 'green'; let marginBottom = '0em'; @@ -258,22 +274,22 @@ class Homework extends Component { ); } + // Headers and stuff around the Tables renderHomeworks(active, staff) { - let empty = false; - let emptyText = 'Jelenleg nincs egyetlen beadhatĂł feladat sem. '; + let noTask = false; + let noTaskText = 'Jelenleg nincs egyetlen beadhatĂł feladat sem. '; let marginBottom = '0em'; - const emptyHeaderText = 'Nincs feladat.'; + const noTaskHeaderText = 'Nincs feladat.'; let headerText = 'AktĂv feladatok'; if (staff) { headerText = 'AktĂv feladatok kijavĂtĂĄsa, mĂłdosĂtĂĄsa vagy tĂśrlĂŠse'; } - if ( - this.props.homeworks.tasks.filter(task => - moment().isBefore(task.deadline) === active).length === 0 + if (this.props.homeworks.tasks.filter(task => + moment().isBefore(task.deadline) === active).length === 0 ) { - empty = true; + noTask = true; } if (!active) { @@ -282,7 +298,7 @@ class Homework extends Component { } else { headerText = 'LejĂĄrt hatĂĄridejĹą feladatok'; } - emptyText = 'Jelenleg nincs egyetlen lejĂĄrt hatĂĄridejĹą feladat sem.'; + noTaskText = 'Jelenleg nincs egyetlen lejĂĄrt hatĂĄridejĹą feladat sem.'; marginBottom = '3em'; } @@ -300,9 +316,11 @@ class Homework extends Component { marginTop: '0.5em', }} /> - {empty - ? emptyMessage(emptyHeaderText, emptyText, marginBottom, false) - : this.renderHomeworksTable(active, staff)} + {noTask ? + customMessage(noTaskHeaderText, noTaskText, marginBottom, false) + : + this.renderHomeworksTable(active, staff) + } </Container> </Segment> ); @@ -323,9 +341,7 @@ class Homework extends Component { <div> <Segment style={{ padding: '0 0 2em 0' }} vertical basic> <Container> - <Header - as='h1' - dividing + <Header dividing as='h1' content='Ăj hĂĄzi feladat lĂŠtrehozĂĄsa' style={{ fontSize: '2em', @@ -344,7 +360,7 @@ class Homework extends Component { </div> ); } - return null; + return null; // ÂŻ\_(ă)_/ÂŻ } } diff --git a/src/components/pages/News.js b/src/components/pages/News.js index 525c8273110f11a3179bb96ef16e17738be2f8e7..11804cfefd75b4a87dfa1db79c3d680de4509a96 100644 --- a/src/components/pages/News.js +++ b/src/components/pages/News.js @@ -11,7 +11,7 @@ import { getNews, deleteNews, setSelectedNews } from '../../actions/news'; import './News.css'; class News extends Component { - componentWillMount() { + UNSAFE_componentWillMount() { this.props.getNews(); } @@ -23,7 +23,7 @@ class News extends Component { style={{ fontSize: '2em', width: '100%' }} > <Grid> - <Grid.Column floated='center' width={12}> + <Grid.Column width={12}> {item.title} </Grid.Column> { this.props.user.role === 'Staff' ? @@ -70,7 +70,7 @@ class News extends Component { renderMultiLine(text) { const strings = text.split('\n'); - return strings.map(string => <p>{string}</p>); + return strings.map(string => <p key={Math.random()}>{string}</p>); } render() { diff --git a/src/components/pages/Profile.js b/src/components/pages/Profile.js index fc6336dcde43ce0a0ce62c1feed37ae91492d4a1..9fb9e0251166b02e7c49fdb72ed8170e85fd1323 100644 --- a/src/components/pages/Profile.js +++ b/src/components/pages/Profile.js @@ -14,7 +14,7 @@ const options = [ ]; class Profile extends Component { - componentWillMount() { + UNSAFE_componentWillMount() { this.props.getDeadline() if (!this.props.id) { this.props.history.push('/home'); @@ -104,7 +104,7 @@ class Profile extends Component { nem titkolt cĂŠlunk ezzel a lelkesedĂŠs felmĂŠrĂŠse. A vĂĄlaszokat a kĂŠrdĂŠsek alatti szĂśvegdobozba vĂĄrjuk. </b> - <ol> + <ul> <li> SzeretnĂŠd kedvenc tantĂĄrgyad vik.wiki oldalĂĄt elĂŠrni, de szomorĂşan lĂĄtod, hogy az oldal nem jĂśn be. @@ -134,12 +134,12 @@ class Profile extends Component { (hasznĂĄld az elĹzĹ feladatban kapott adatokat). BelĂŠpĂŠs utĂĄn keresd meg a feladat megoldĂĄsĂĄt! </li> - </ol> + </ul> </div> } value={motivationExercise} /> : - <HiddenForm + <HiddenForm fontWeight='normal' label={ <div> @@ -148,7 +148,7 @@ class Profile extends Component { nem titkolt cĂŠlunk ezzel a lelkesedĂŠs felmĂŠrĂŠse. A vĂĄlaszokat a kĂŠrdĂŠsek alatti szĂśvegdobozba vĂĄrjuk. </b> - <ol> + <ul> <li> SzeretnĂŠd kedvenc tantĂĄrgyad vik.wiki oldalĂĄt elĂŠrni, de szomorĂşan lĂĄtod, hogy az oldal nem jĂśn be. @@ -157,7 +157,6 @@ class Profile extends Component { CsodĂĄlkozva lĂĄtod, hogy a bĂśngĂŠszĹ cĂmsorĂĄba Ărva elĂŠred a kiszolgĂĄlĂł webszervert. Mi lehet a baj? </li> - <br /> <li> KĂŠt elĹadĂĄs kĂśzti szĂźnetben Ăşgy dĂśntesz, hogy laptopoddal az index.hu tech cikkeit fogod gĂśrgetni. @@ -167,18 +166,16 @@ class Profile extends Component { Ugyanakkor a Facebook, a Gmail, a YouTube, de mĂŠg az egyetemi oldalak tĂśbbsĂŠge is mĹąkĂśdik. Szerinted mi lehet a hiba oka? </li> - <br /> <li> TalĂĄlsz egy ĂŠrtelmetlen szĂśveget egy honlapon (pĂŠldĂĄul: <a href='http://kszkepzes18.sch.bme.hu/zebra.html'>http://kszkepzes18.sch.bme.hu/zebra.html</a>), de feltĹąnik, hogy kĂŠt egyenlĹsĂŠgjellel fejezĹdik be. Nyomozz, s a vĂŠgeredmĂŠnyt (amit talĂĄltĂĄl) Ărd ide! </li> - <br /> <li> A <b>kszkepzes18.sch.bme.hu</b> cĂmen elĂŠrhetĹ gĂŠpen fut egy szolgĂĄltatĂĄs az alapĂŠrtelmezett <b>5432</b> porton (hasznĂĄld az elĹzĹ feladatban kapott adatokat). BelĂŠpĂŠs utĂĄn keresd meg a feladat megoldĂĄsĂĄt! </li> - </ol> + </ul> </div> } value={motivationExercise} /> diff --git a/src/components/pages/Schedule.js b/src/components/pages/Schedule.js index 03f019c43ee6b4106eba35375a869d14fc8b8bcd..e8b1c9cf6e50546bcdb78eaa06c9dcee834a0f3c 100644 --- a/src/components/pages/Schedule.js +++ b/src/components/pages/Schedule.js @@ -8,7 +8,7 @@ import { getStudentEvents } from '../../actions/statistics'; class Schedule extends Component { state = { activeIndex: 0 } - componentWillMount() { + UNSAFE_componentWillMount() { this.props.getStudentEvents(); } @@ -25,7 +25,7 @@ class Schedule extends Component { const events = this.props.events; const panels = events.map(event => ( - <Accordion> + <Accordion key={Math.random()}> <Accordion.Title active={activeIndex === event.id} index={event.id} @@ -63,10 +63,7 @@ class Schedule extends Component { marginTop: '0.5em', }} /> - <Accordion fluid styled - defaultActiveIndex={-1} - panels={panels} - > + <Accordion fluid styled> {panels} </Accordion> <Header diff --git a/src/components/pages/Trainees.js b/src/components/pages/Trainees.js index 99c0575bdae12977402ab0719301faaabe8497a9..7010e377bf0ed1efeb5b177d6499b9de48ca9ed3 100644 --- a/src/components/pages/Trainees.js +++ b/src/components/pages/Trainees.js @@ -4,7 +4,7 @@ import { connect } from 'react-redux'; import { getTrainees, getStaffEvents } from '../../actions/statistics'; class Trainees extends Component { - componentWillMount() { + UNSAFE_componentWillMount() { this.props.getTrainees(); this.props.getStaffEvents(); } diff --git a/src/setupProxy.js b/src/setupProxy.js index a824924f5ae9e0bba61eeea4d341b81fa585e007..539efe34da9734a7f4f023b167e654af53ecc100 100644 --- a/src/setupProxy.js +++ b/src/setupProxy.js @@ -1,5 +1,6 @@ const proxy = require('http-proxy-middleware'); module.exports = function(app) { - app.use(proxy('/api', { target: 'http://127.0.0.1:8000/' })); + app.use(proxy('/api', { target: 'http://127.0.0.1:8000/' })) + app.use(proxy('/media', { target: 'http://127.0.0.1:8000/' })) };