diff --git a/.eslintrc.js b/.eslintrc.js
index e461b38..74e14c5 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -12,6 +12,7 @@ module.exports = {
SharedArrayBuffer: 'readonly',
},
rules: {
+ 'react/prop-types': 0,
'no-undef': ['error'],
eqeqeq: ['warn', 'smart'],
'no-unused-vars': 'warn',
diff --git a/package-lock.json b/package-lock.json
index 8aca78f..4ee91ba 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1576,6 +1576,16 @@
"resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
"integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
},
+ "array-includes": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz",
+ "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==",
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0",
+ "is-string": "^1.0.5"
+ }
+ },
"array-union": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
@@ -1594,6 +1604,16 @@
"resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
"integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
},
+ "array.prototype.flatmap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz",
+ "integrity": "sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==",
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1",
+ "function-bind": "^1.1.1"
+ }
+ },
"asap": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
@@ -2162,6 +2182,15 @@
}
}
},
+ "call-bind": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz",
+ "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.0"
+ }
+ },
"caller-callsite": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
@@ -2809,6 +2838,14 @@
"randombytes": "^2.0.0"
}
},
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
"dom-serializer": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
@@ -2967,6 +3004,47 @@
"is-arrayish": "^0.2.1"
}
},
+ "es-abstract": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+ "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.2",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.1",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ },
+ "dependencies": {
+ "object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ }
+ }
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
"es5-ext": {
"version": "0.10.53",
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
@@ -3006,6 +3084,35 @@
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
"integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="
},
+ "eslint-plugin-react": {
+ "version": "7.21.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.21.5.tgz",
+ "integrity": "sha512-8MaEggC2et0wSF6bUeywF7qQ46ER81irOdWS4QWxnnlAEsnzeBevk1sWh7fhpCghPpXb+8Ks7hvaft6L/xsR6g==",
+ "requires": {
+ "array-includes": "^3.1.1",
+ "array.prototype.flatmap": "^1.2.3",
+ "doctrine": "^2.1.0",
+ "has": "^1.0.3",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "object.entries": "^1.1.2",
+ "object.fromentries": "^2.0.2",
+ "object.values": "^1.1.1",
+ "prop-types": "^15.7.2",
+ "resolve": "^1.18.1",
+ "string.prototype.matchall": "^4.0.2"
+ },
+ "dependencies": {
+ "resolve": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
+ "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==",
+ "requires": {
+ "is-core-module": "^2.1.0",
+ "path-parse": "^1.0.6"
+ }
+ }
+ }
+ },
"eslint-scope": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
@@ -3387,6 +3494,16 @@
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
},
+ "get-intrinsic": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz",
+ "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ }
+ },
"get-value": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
@@ -3704,6 +3821,16 @@
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
+ "internal-slot": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz",
+ "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==",
+ "requires": {
+ "es-abstract": "^1.17.0-next.1",
+ "has": "^1.0.3",
+ "side-channel": "^1.0.2"
+ }
+ },
"invariant": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
@@ -3748,6 +3875,19 @@
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
},
+ "is-callable": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
+ "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA=="
+ },
+ "is-core-module": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz",
+ "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==",
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
"is-data-descriptor": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
@@ -3766,6 +3906,11 @@
}
}
},
+ "is-date-object": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
+ "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g=="
+ },
"is-descriptor": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
@@ -3811,6 +3956,11 @@
"is-extglob": "^2.1.1"
}
},
+ "is-negative-zero": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz",
+ "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE="
+ },
"is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -3855,6 +4005,27 @@
"isobject": "^3.0.1"
}
},
+ "is-regex": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
+ "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "is-string": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
+ "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ=="
+ },
+ "is-symbol": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+ "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
"is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
@@ -3963,6 +4134,28 @@
"semver": "^5.6.0"
}
},
+ "jsx-ast-utils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.1.0.tgz",
+ "integrity": "sha512-d4/UOjg+mxAWxCiF0c5UTSwyqbchkbqCvK87aBovhnh8GtysTjWmgC63tY0cJx/HzGgm9qnA147jVBdpOiQ2RA==",
+ "requires": {
+ "array-includes": "^3.1.1",
+ "object.assign": "^4.1.1"
+ },
+ "dependencies": {
+ "object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ }
+ }
+ }
+ },
"jwa": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
@@ -4721,6 +4914,11 @@
}
}
},
+ "object-inspect": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
+ "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA=="
+ },
"object-keys": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
@@ -4750,6 +4948,27 @@
"object-keys": "^1.0.11"
}
},
+ "object.entries": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz",
+ "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==",
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5",
+ "has": "^1.0.3"
+ }
+ },
+ "object.fromentries": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz",
+ "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==",
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3"
+ }
+ },
"object.pick": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
@@ -4758,6 +4977,17 @@
"isobject": "^3.0.1"
}
},
+ "object.values": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz",
+ "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==",
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3"
+ }
+ },
"on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
@@ -5801,6 +6031,15 @@
"resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz",
"integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA=="
},
+ "regexp.prototype.flags": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz",
+ "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==",
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1"
+ }
+ },
"regexpu-core": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz",
@@ -6134,6 +6373,47 @@
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz",
"integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg=="
},
+ "side-channel": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.3.tgz",
+ "integrity": "sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g==",
+ "requires": {
+ "es-abstract": "^1.18.0-next.0",
+ "object-inspect": "^1.8.0"
+ },
+ "dependencies": {
+ "es-abstract": {
+ "version": "1.18.0-next.1",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
+ "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.2",
+ "is-negative-zero": "^2.0.0",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.1",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ }
+ },
+ "object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ }
+ }
+ }
+ },
"signal-exit": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
@@ -6416,6 +6696,101 @@
"resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz",
"integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs="
},
+ "string.prototype.matchall": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz",
+ "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==",
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0",
+ "has-symbols": "^1.0.1",
+ "internal-slot": "^1.0.2",
+ "regexp.prototype.flags": "^1.3.0",
+ "side-channel": "^1.0.2"
+ }
+ },
+ "string.prototype.trimend": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz",
+ "integrity": "sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==",
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.1"
+ },
+ "dependencies": {
+ "es-abstract": {
+ "version": "1.18.0-next.1",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
+ "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.2",
+ "is-negative-zero": "^2.0.0",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.1",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ }
+ },
+ "object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ }
+ }
+ }
+ },
+ "string.prototype.trimstart": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz",
+ "integrity": "sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==",
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.1"
+ },
+ "dependencies": {
+ "es-abstract": {
+ "version": "1.18.0-next.1",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
+ "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.2",
+ "is-negative-zero": "^2.0.0",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.1",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ }
+ },
+ "object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ }
+ }
+ }
+ },
"string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
diff --git a/package.json b/package.json
index a1c0647..acbe768 100644
--- a/package.json
+++ b/package.json
@@ -13,6 +13,7 @@
"author": "",
"license": "ISC",
"dependencies": {
+ "eslint-plugin-react": "^7.21.5",
"next": "^9.2.2",
"react": "^16.13.0",
"react-dom": "^16.13.0",
diff --git a/src/components/Helps.js b/src/components/Helps.js
deleted file mode 100644
index 30ae807..0000000
--- a/src/components/Helps.js
+++ /dev/null
@@ -1,50 +0,0 @@
-import styles from './Helps.module.css'
-
-import helps from '../data/helps.json'
-const header = helps.header
-const helpRows = helps.rows
-
-export default function Helps () {
- const renderTable = () => {
- return (
-
-
-
- {header.map((h, i) => {
- return (
-
- {h}
-
- )
- })}
-
-
-
- {Object.keys(helpRows).map((key, i) => {
- const item = helpRows[key]
- return (
-
-
- {item.name}
-
-
- {item.description}
-
-
- )
- })}
-
-
- )
- }
- return (
-
-
- Amiben tudsz segíteni:
-
-
- {renderTable()}
-
-
- )
-}
diff --git a/src/components/Helps.module.css b/src/components/Helps.module.css
deleted file mode 100644
index ab04dbe..0000000
--- a/src/components/Helps.module.css
+++ /dev/null
@@ -1,26 +0,0 @@
-.text {
- color: white;
- font-size: 18px;
-}
-
-.helpTable {
- width: 100%;
-}
-
-.helpTable td {
- padding: 5px 2px;
-}
-
-.helpHeader {
- font-size: 20px;
- text-align: center;
-}
-
-.helpRow td {
- padding: 10px;
- font-size: 16px;
-}
-
-.title {
- text-align: center;
-}
diff --git a/src/components/todoStuff/todoCard.js b/src/components/todoStuff/todoCard.js
new file mode 100644
index 0000000..9a52e44
--- /dev/null
+++ b/src/components/todoStuff/todoCard.js
@@ -0,0 +1,48 @@
+import React from 'react'
+
+import styles from './todoCard.module.css'
+
+const clickableTypes = ['todo', 'blocked', 'inprogress', 'testing']
+
+export default function TodoCard(props) {
+ const { categories, type, onClick, userId } = props
+ const { name, description, category, points, votes, id } = props.cardData
+ const clickable = clickableTypes.includes(type)
+ const voted = votes.includes(userId)
+
+ return (
+ {
+ if (clickable) {
+ onClick(id)
+ }
+ }}
+ >
+
+ {`#${id}`}
+ {name}
+
+
+
+ {category}
+
+
+
+
+
{`Votes: ${votes.length}`}
+
+
{points}
+
+
+ )
+}
diff --git a/src/components/todoStuff/todoCard.module.css b/src/components/todoStuff/todoCard.module.css
new file mode 100644
index 0000000..baaf9c7
--- /dev/null
+++ b/src/components/todoStuff/todoCard.module.css
@@ -0,0 +1,48 @@
+.card {
+ border: 2px solid #99f;
+ border-radius: 2px;
+ padding: 5px;
+ margin: 6px 3px;
+}
+
+.voted {
+ border: 2px solid #cf9;
+}
+
+.clickable {
+ cursor: pointer;
+}
+
+.clickable:hover {
+ background-color: #333;
+ border: 2px solid #f99;
+}
+
+.card > div {
+ margin: 5px 0px;
+}
+
+.description {
+ word-break: normal;
+ font-size: 14px;
+ color: white;
+}
+
+.category {
+ word-break: break-all;
+ font-size: 10px;
+}
+
+.numbers {
+ display: flex;
+ justify-content: space-between;
+}
+
+.numbers > div {
+ font-size: 12px;
+}
+
+.id {
+ margin: 0px 3px;
+ color: #999;
+}
diff --git a/src/components/todoStuff/todoTable.js b/src/components/todoStuff/todoTable.js
new file mode 100644
index 0000000..731a243
--- /dev/null
+++ b/src/components/todoStuff/todoTable.js
@@ -0,0 +1,82 @@
+import React, { useState, useEffect } from 'react'
+
+import LoadingIndicator from '../LoadingIndicator.js'
+import TodoCard from './todoCard.js'
+
+import constants from '../../constants.json'
+import styles from './todoTable.module.css'
+
+export default function TodoTable() {
+ const [cards, setCards] = useState(null)
+ const [columns, setColumns] = useState(null)
+ const [categories, setCategories] = useState(null)
+ const [userId, setUserId] = useState(null)
+
+ useEffect(() => {
+ console.info('Fetching todos')
+ getTodos()
+ }, [])
+
+ const getTodos = () => {
+ fetch(`${constants.apiUrl}todos`, {
+ credentials: 'include',
+ })
+ .then((resp) => {
+ return resp.json()
+ })
+ .then((data) => {
+ setCards(data.todos.cards)
+ setColumns(data.todos.columns)
+ setCategories(data.todos.categories)
+ setUserId(data.userId)
+ })
+ }
+
+ const onCardClick = (id) => {
+ fetch(`${constants.apiUrl}todos?id=${id}`, {
+ credentials: 'include',
+ })
+ .then((resp) => {
+ return resp.json()
+ })
+ .then((data) => {
+ console.log(data)
+ getTodos()
+ })
+ }
+
+ if (!cards || !columns || !categories) {
+ return
+ }
+
+ return (
+
+
+ {Object.keys(columns).map((key) => {
+ const category = columns[key]
+ return (
+
+
{category.name}
+ {cards.map((card, i) => {
+ if (card.state === key) {
+ return (
+
+ )
+ } else {
+ return null
+ }
+ })}
+
+ )
+ })}
+
+
+ )
+}
diff --git a/src/components/todoStuff/todoTable.module.css b/src/components/todoStuff/todoTable.module.css
new file mode 100644
index 0000000..91625be
--- /dev/null
+++ b/src/components/todoStuff/todoTable.module.css
@@ -0,0 +1,16 @@
+.table {
+ display: flex;
+}
+
+.categoryName {
+ text-align: center;
+ margin: 5px 0px;
+ font-size: 16px;
+ font-weight: bold;
+ color: white;
+ white-space: nowrap;
+}
+
+.tableCol {
+ flex: 1;
+}
diff --git a/src/constants.json b/src/constants.json
index 8650745..dec44ec 100644
--- a/src/constants.json
+++ b/src/constants.json
@@ -1,6 +1,6 @@
{
"siteUrl": "https://qmining.frylabs.net/",
- "apiUrl": "https://api.frylabs.net/",
+ "apiUrl": "http://localhost:8080/",
"mobileWindowWidth": 700,
"maxQuestionsToRender": 250
}
diff --git a/src/data/helps.json b/src/data/helps.json
index abdf04b..9da4768 100644
--- a/src/data/helps.json
+++ b/src/data/helps.json
@@ -8,10 +8,6 @@
"name": "Visszajelzésben",
"description": "Meséld el mi nem tetszik, és mit csinálnál máshogy! Apró részletek is jöhetnek."
},
- "translator": {
- "name": "Fogalmazásban",
- "description": "Fogalmazd meg felhasználóbarátan azokat a szövegeket/stringeket amikkel a weboldalon és a script használata közben találkozol!"
- },
"bugreporter": {
"name": "Bug reportolásban",
"description": "Jelents akármit ami nem úgy működik ahogy kellene! Akár egy rövid leírás is segíthet, de ha tutira akarsz menni akkor a 'Feedback' fülön tölts ki mindent. Ha kérdés közben van hiba ments le azt a kérdés oldalt (CTRL + S), és a teszt végén az eredmények oldalt, és küld el itt. Így tudom könnyen reprodukálni a problémát."
diff --git a/src/data/repos.json b/src/data/repos.json
index 3b1d326..7898d12 100644
--- a/src/data/repos.json
+++ b/src/data/repos.json
@@ -1,11 +1,5 @@
{
- "description": "Projekt repók. Itt megtalálod az összes projektet ami működteti az egész rendszert, és hozzá egy rövid leírást, az issues linket ahol látod az eddigi problémákat/hozzá tudsz adni újjakat, illetve linket a fejlesztési doksikhoz. Amik röviden leírások hogy hogyan kell setupolni a projektet, elindítani, debugolni, tesztelni",
- "header": [
- "Leírás",
- "GitLab",
- "Devel docs"
- ],
- "repos":{
+ "repos": {
"userScriptRepo": {
"description": "User script kliens szerverhez",
"href": "https://gitlab.com/MrFry/moodle-test-userscript"
diff --git a/src/data/tabs.json b/src/data/tabs.json
index eee620e..468bd44 100644
--- a/src/data/tabs.json
+++ b/src/data/tabs.json
@@ -25,7 +25,7 @@
},
"contribute": {
"href": "/contribute",
- "text": "Contribute"
+ "text": "Contribute / Todos"
},
"ranklist": {
"href": "/ranklist",
diff --git a/src/pages/contribute.js b/src/pages/contribute.js
index a9c7af7..0030376 100644
--- a/src/pages/contribute.js
+++ b/src/pages/contribute.js
@@ -1,74 +1,51 @@
+import React from 'react'
+
import Button from '../components/Button.js'
-import Helps from '../components/Helps.js'
import Sleep from '../components/sleep'
+import TodoTable from '../components/todoStuff/todoTable'
import styles from './contribute.module.css'
import repos from '../data/repos.json'
-export default function contribute (props) {
+export default function contribute() {
return (
+
+
+ Egy kártyára kattintva szavazhatsz. Minél több szavazat érkezik egy
+ kártyára, annál magasabb lesz a pioritása
+
-
- {repos.description}
+ Akkárhogy próbálsz segíteni a projektben, akkor azt saját érdekedben
+ csak álnévvel tedd!!!
-
- Ha commitolsz, vagy akkárhogy próbálsz segíteni a projektben, akkor azt saját érdekedben
- csak névtelenül, vagy álnévvel tedd!!!
+
+
Git repo links
+ {Object.keys(repos.repos).map((key) => {
+ let repo = repos.repos[key]
+ return (
+
+ )
+ })}
-
-
-
- {repos.header.map((x, i) => {
- return (
-
- {x}
-
- )
- })}
-
-
-
- {Object.keys(repos.repos).map((key) => {
- let repo = repos.repos[key]
- return (
-
-
- {repo.description}
-
-
-
- GitLab repo
-
-
-
-
- Devel docs
-
-
-
- )
- })}
-
-
- IRC chat: egy IRC chatszoba van létrehozva egy random szerveren, ahol tudsz azonnal üzenni,
- és ha épp fent vagyok akkor azonnal válaszolok
+ IRC chat: egy IRC chatszoba van létrehozva egy random szerveren, ahol
+ tudsz azonnal üzenni, és ha épp fent vagyok akkor azonnal válaszolok
-
+
- Kérdés szerkesztő: Ezen az oldalon lehet szerkeszteni az összes kérdést, duplikációkat
- eltávolítani vagy helytelen válaszokat kijavítani kézzel. Ha van hozzá jelszavad, akkor ezt
- azonnal el tudod menteni, és éles adatbázis frissül ezzel, ha nincs és úgy érzed szeretnél
- akkor kattints a fenti 'IRC chat' gombra!
+ Kérdés szerkesztő: Ezen az oldalon lehet szerkeszteni az összes kérdést,
+ duplikációkat eltávolítani vagy helytelen válaszokat kijavítani kézzel.
+ Ha van hozzá jelszavad, akkor ezt azonnal el tudod menteni, ha nincs és
+ úgy érzed szeretnél akkor kattints a fenti IRC chat gombra!
-
+
)
}
diff --git a/src/pages/contribute.module.css b/src/pages/contribute.module.css
index ae8154b..653c274 100644
--- a/src/pages/contribute.module.css
+++ b/src/pages/contribute.module.css
@@ -1,27 +1,16 @@
-.repoTable {
- width: 100%;
+.repos {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
}
.description {
- font-size: 17px;
+ font-size: 15px;
color: white;
text-align: center;
margin: 10px;
}
-.repoTable thead td {
- padding: 10px;
- text-align: center;
- font-size: 25px;
- color: white;
-}
-
-.repoTable tbody td {
- padding: 10px;
- text-align: center;
- font-size: 18px;
-}
-
.warning {
color: white;
padding: 10px;