diff --git a/NEWS.cs.md b/NEWS.cs.md index c95c6575f..f2c61a9e7 100644 --- a/NEWS.cs.md +++ b/NEWS.cs.md @@ -1,3 +1,10 @@ +#### Verze 3.1.3 + +- Přidána možnost odeslat novému uživateli mail s pozvánkou (admin již nemusí uživateli nastavovat heslo). +- Je možné zobrazit i pojmy bez názvu v primárním jazyce instance. +- Formulář pro vytvoření nového atributu umožňuje vyplnit název a popis ve více jazycích. +- Opravy chyb, aktualizace knihoven. + #### Verze 3.1.2 - Přidána možnost resetovat zapomenuté heslo. diff --git a/NEWS.en.md b/NEWS.en.md index 57aabeb03..fe7bb4d06 100644 --- a/NEWS.en.md +++ b/NEWS.en.md @@ -1,3 +1,10 @@ +#### Version 3.1.3 + +- Added invitation-based new account registration (admin no longer has to set user's password). +- Allow reading terms without label in primary instance language. +- Allow setting multilingual label and comment on new properties. +- Bug fixes, dependency updates. + #### Version 3.1.2 - Added password recovery. diff --git a/package-lock.json b/package-lock.json index 384a95ecd..e1a8feb8f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "termit-ui", - "version": "3.1.2", + "version": "3.1.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "termit-ui", - "version": "3.1.2", + "version": "3.1.3", "license": "GPL-3.0-only", "dependencies": { "@formatjs/intl-pluralrules": "^5.2.4", @@ -20,18 +20,19 @@ "classnames": "^2.3.2", "dom-serializer": "^1.3.2", "domhandler": "^4.3.1", - "easymde": "2.15.0", + "easymde": "2.18.0", "html-to-react": "1.5.0", "htmlparser2": "^4.1.0", "intelligent-tree-select": "0.11.4", "iso-639-1": "^2.1.15", "javascript-time-ago": "2.5.9", "js-cookie": "^3.0.5", - "jsonld": "5.2.0", + "jsonld": "8.3.2", "last": "^1.1.0", "ld-query": "^2.6.1", "lodash": "^4.17.21", "luxon": "^3.3.0", + "marked": "^9.1.6", "object-assign": "4.1.1", "oidc-client": "^1.11.5", "promise": "8.3.0", @@ -52,7 +53,7 @@ "react-router-dom": "^5.3.0", "react-router-redux": "^4.0.8", "react-scripts": "5.0.1", - "react-simplemde-editor": "^5.0.2", + "react-simplemde-editor": "^5.2.0", "react-spinners": "^0.13.8", "react-table": "^7.8.0", "reactstrap": "^8.10.1", @@ -2055,16 +2056,16 @@ } }, "node_modules/@digitalbazaar/http-client": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-1.2.0.tgz", - "integrity": "sha512-W9KQQ5pUJcaR0I4c2HPJC0a7kRbZApIorZgPnEDwMBgj16iQzutGLrCXYaZOmxqVLVNqqlQ4aUJh+HBQZy4W6Q==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-3.4.1.tgz", + "integrity": "sha512-Ahk1N+s7urkgj7WvvUND5f8GiWEPfUw0D41hdElaqLgu8wZScI8gdI0q+qWw5N1d35x7GCRH2uk9mi+Uzo9M3g==", "dependencies": { - "esm": "^3.2.22", - "ky": "^0.25.1", - "ky-universal": "^0.8.2" + "ky": "^0.33.3", + "ky-universal": "^0.11.0", + "undici": "^5.21.2" }, "engines": { - "node": ">=10.0.0" + "node": ">=14.0" } }, "node_modules/@emotion/babel-plugin": { @@ -2278,6 +2279,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "engines": { + "node": ">=14" + } + }, "node_modules/@floating-ui/core": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", @@ -3630,9 +3639,9 @@ "dev": true }, "node_modules/@types/marked": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-2.0.5.tgz", - "integrity": "sha512-shRZ7XnYFD/8n8zSjKvFdto1QNSf4tONZIlNEZGrJe8GsOE8DL/hG1Hbl8gZlfLnjS7+f5tZGIaTgfpyW38h4w==" + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.3.2.tgz", + "integrity": "sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==" }, "node_modules/@types/mdast": { "version": "3.0.10", @@ -3702,7 +3711,7 @@ "version": "17.0.20", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.20.tgz", "integrity": "sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA==", - "dev": true, + "devOptional": true, "dependencies": { "@types/react": "^17" } @@ -5383,9 +5392,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001563", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001563.tgz", - "integrity": "sha512-na2WUmOxnwIZtwnFI2CZ/3er0wdNzU7hN+cPYz/z2ajHThnkWjNBOpEPP4n+4r2WPM847JaMotaJE3bnfzjyKw==", + "version": "1.0.30001643", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001643.tgz", + "integrity": "sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==", "funding": [ { "type": "opencollective", @@ -6434,11 +6443,11 @@ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" }, "node_modules/data-uri-to-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", - "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", "engines": { - "node": ">= 6" + "node": ">= 12" } }, "node_modules/data-urls": { @@ -6854,23 +6863,26 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" }, "node_modules/easymde": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/easymde/-/easymde-2.15.0.tgz", - "integrity": "sha512-9jMRIVvKt1d0UjRN45yotUYECAM4xvw0TTAQw8sYDONP++keWJVnd8Xrn+V+vQEN/v9/X0SWEoo1rFSgCooGpw==", + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/easymde/-/easymde-2.18.0.tgz", + "integrity": "sha512-IxVVUxNWIoXLeqtBU4BLc+eS/ScYhT1Dcb6yF5Wchoj1iXAV+TIIDWx+NCaZhY7RcSHqDPKllbYq7nwGKILnoA==", "dependencies": { - "@types/codemirror": "0.0.109", - "@types/marked": "^2.0.2", - "codemirror": "^5.61.0", + "@types/codemirror": "^5.60.4", + "@types/marked": "^4.0.7", + "codemirror": "^5.63.1", "codemirror-spell-checker": "1.1.2", - "marked": "^2.0.3" + "marked": "^4.1.0" } }, - "node_modules/easymde/node_modules/@types/codemirror": { - "version": "0.0.109", - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.109.tgz", - "integrity": "sha512-cSdiHeeLjvGn649lRTNeYrVCDOgDrtP+bDDSFDd1TF+i0jKGPDRozno2NOJ9lTniso+taiv4kiVS8dgM8Jm5lg==", - "dependencies": { - "@types/tern": "*" + "node_modules/easymde/node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" } }, "node_modules/ee-first": { @@ -7611,14 +7623,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", - "engines": { - "node": ">=6" - } - }, "node_modules/espree": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", @@ -7944,16 +7948,25 @@ } }, "node_modules/fetch-blob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-2.1.2.tgz", - "integrity": "sha512-YKqtUDwqLyfyMnmbw8XD6Q8j9i/HggKtPEI+pZ1+8bvheBu78biSmNaXWusx1TauGqtUUGx/cBb1mKdq2rLYow==", - "engines": { - "node": "^10.17.0 || >=12.3.0" - }, - "peerDependenciesMeta": { - "domexception": { - "optional": true + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" } }, "node_modules/file-entry-cache": { @@ -8240,6 +8253,17 @@ "node": ">=6" } }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -9044,7 +9068,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", - "dev": true + "devOptional": true }, "node_modules/import-fresh": { "version": "3.3.0", @@ -10363,6 +10387,12 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", + "peer": true + }, "node_modules/js-cookie": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", @@ -10516,17 +10546,17 @@ } }, "node_modules/jsonld": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/jsonld/-/jsonld-5.2.0.tgz", - "integrity": "sha512-JymgT6Xzk5CHEmHuEyvoTNviEPxv6ihLWSPu1gFdtjSAyM6cFqNrv02yS/SIur3BBIkCf0HjizRc24d8/FfQKw==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/jsonld/-/jsonld-8.3.2.tgz", + "integrity": "sha512-MwBbq95szLwt8eVQ1Bcfwmgju/Y5P2GdtlHE2ncyfuYjIdEhluUVyj1eudacf1mOkWIoS9GpDBTECqhmq7EOaA==", "dependencies": { - "@digitalbazaar/http-client": "^1.1.0", + "@digitalbazaar/http-client": "^3.4.1", "canonicalize": "^1.0.1", "lru-cache": "^6.0.0", - "rdf-canonize": "^3.0.0" + "rdf-canonize": "^3.4.0" }, "engines": { - "node": ">=12" + "node": ">=14" } }, "node_modules/jsonpointer": { @@ -10574,33 +10604,33 @@ } }, "node_modules/ky": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/ky/-/ky-0.25.1.tgz", - "integrity": "sha512-PjpCEWlIU7VpiMVrTwssahkYXX1by6NCT0fhTUX34F3DTinARlgMpriuroolugFPcMgpPWrOW4mTb984Qm1RXA==", + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/ky/-/ky-0.33.3.tgz", + "integrity": "sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==", "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sindresorhus/ky?sponsor=1" } }, "node_modules/ky-universal": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/ky-universal/-/ky-universal-0.8.2.tgz", - "integrity": "sha512-xe0JaOH9QeYxdyGLnzUOVGK4Z6FGvDVzcXFTdrYA1f33MZdEa45sUDaMBy98xQMcsd2XIBrTXRrRYnegcSdgVQ==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/ky-universal/-/ky-universal-0.11.0.tgz", + "integrity": "sha512-65KyweaWvk+uKKkCrfAf+xqN2/epw1IJDtlyCPxYffFCMR8u1sp2U65NtWpnozYfZxQ6IUzIlvUcw+hQ82U2Xw==", "dependencies": { "abort-controller": "^3.0.0", - "node-fetch": "3.0.0-beta.9" + "node-fetch": "^3.2.10" }, "engines": { - "node": ">=10.17" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sindresorhus/ky-universal?sponsor=1" }, "peerDependencies": { - "ky": ">=0.17.0", - "web-streams-polyfill": ">=2.0.0" + "ky": ">=0.31.4", + "web-streams-polyfill": ">=3.2.1" }, "peerDependenciesMeta": { "web-streams-polyfill": { @@ -10825,14 +10855,14 @@ } }, "node_modules/marked": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/marked/-/marked-2.1.3.tgz", - "integrity": "sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA==", + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.6.tgz", + "integrity": "sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==", "bin": { - "marked": "bin/marked" + "marked": "bin/marked.js" }, "engines": { - "node": ">= 10" + "node": ">= 16" } }, "node_modules/mdast-util-definitions": { @@ -11246,16 +11276,35 @@ "tslib": "^2.0.3" } }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-fetch": { - "version": "3.0.0-beta.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.0.0-beta.9.tgz", - "integrity": "sha512-RdbZCEynH2tH46+tj0ua9caUHVWrd/RHnRfvly2EVdqGmI3ndS1Vn/xjm5KuGejDt2RNDQsVRLPNd2QPwcewVg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "dependencies": { - "data-uri-to-buffer": "^3.0.1", - "fetch-blob": "^2.1.1" + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" }, "engines": { - "node": "^10.17 || >=12.3" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -13026,7 +13075,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.0.tgz", "integrity": "sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==", - "dev": true, "bin": { "prettier": "bin-prettier.js" }, @@ -13459,9 +13507,9 @@ } }, "node_modules/rdf-canonize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-3.0.0.tgz", - "integrity": "sha512-LXRkhab1QaPJnhUIt1gtXXKswQCZ9zpflsSZFczG7mCLAkMvVjdqCGk9VXCUss0aOUeEyV2jtFxGcdX8DSkj9w==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-3.4.0.tgz", + "integrity": "sha512-fUeWjrkOO0t1rg7B2fdyDTvngj+9RlUyL92vOdiB7c0FPguWVsniIMjEtHH+meLBO9rzkUlUzBVXgWrjI8P9LA==", "dependencies": { "setimmediate": "^1.0.5" }, @@ -14792,7 +14840,7 @@ "version": "1.63.3", "resolved": "https://registry.npmjs.org/sass/-/sass-1.63.3.tgz", "integrity": "sha512-ySdXN+DVpfwq49jG1+hmtDslYqpS7SkOR5GpF6o2bmb1RL/xS+wvPmegMvMywyfsmAV6p7TgwXYGrCZIFFbAHg==", - "dev": true, + "devOptional": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -15040,7 +15088,7 @@ "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "node_modules/setprototypeof": { "version": "1.2.0", @@ -16298,7 +16346,6 @@ "version": "4.9.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", - "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -16326,6 +16373,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -16698,6 +16756,14 @@ "minimalistic-assert": "^1.0.0" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "engines": { + "node": ">= 8" + } + }, "node_modules/webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", @@ -18906,13 +18972,13 @@ } }, "@digitalbazaar/http-client": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-1.2.0.tgz", - "integrity": "sha512-W9KQQ5pUJcaR0I4c2HPJC0a7kRbZApIorZgPnEDwMBgj16iQzutGLrCXYaZOmxqVLVNqqlQ4aUJh+HBQZy4W6Q==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-3.4.1.tgz", + "integrity": "sha512-Ahk1N+s7urkgj7WvvUND5f8GiWEPfUw0D41hdElaqLgu8wZScI8gdI0q+qWw5N1d35x7GCRH2uk9mi+Uzo9M3g==", "requires": { - "esm": "^3.2.22", - "ky": "^0.25.1", - "ky-universal": "^0.8.2" + "ky": "^0.33.3", + "ky-universal": "^0.11.0", + "undici": "^5.21.2" } }, "@emotion/babel-plugin": { @@ -19024,7 +19090,8 @@ "@emotion/use-insertion-effect-with-fallbacks": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", - "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==" + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "requires": {} }, "@emotion/utils": { "version": "1.2.1", @@ -19085,6 +19152,11 @@ } } }, + "@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==" + }, "@floating-ui/core": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", @@ -20126,9 +20198,9 @@ "dev": true }, "@types/marked": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-2.0.5.tgz", - "integrity": "sha512-shRZ7XnYFD/8n8zSjKvFdto1QNSf4tONZIlNEZGrJe8GsOE8DL/hG1Hbl8gZlfLnjS7+f5tZGIaTgfpyW38h4w==" + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.3.2.tgz", + "integrity": "sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==" }, "@types/mdast": { "version": "3.0.10", @@ -20198,7 +20270,7 @@ "version": "17.0.20", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.20.tgz", "integrity": "sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA==", - "dev": true, + "devOptional": true, "requires": { "@types/react": "^17" } @@ -20726,7 +20798,8 @@ "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "requires": {} }, "acorn-node": { "version": "1.8.2", @@ -20814,7 +20887,8 @@ "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} }, "ancestors": { "version": "0.0.3", @@ -21138,7 +21212,8 @@ "babel-plugin-named-asset-import": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", - "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==" + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", + "requires": {} }, "babel-plugin-polyfill-corejs2": { "version": "0.3.1", @@ -21366,7 +21441,8 @@ "bootstrap": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz", - "integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==" + "integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==", + "requires": {} }, "brace-expansion": { "version": "1.1.11", @@ -21481,9 +21557,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001563", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001563.tgz", - "integrity": "sha512-na2WUmOxnwIZtwnFI2CZ/3er0wdNzU7hN+cPYz/z2ajHThnkWjNBOpEPP4n+4r2WPM847JaMotaJE3bnfzjyKw==" + "version": "1.0.30001643", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001643.tgz", + "integrity": "sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==" }, "canonicalize": { "version": "1.0.5", @@ -22068,7 +22144,8 @@ "css-prefers-color-scheme": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==" + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "requires": {} }, "css-select": { "version": "4.2.1", @@ -22167,7 +22244,8 @@ "cssnano-utils": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.0.2.tgz", - "integrity": "sha512-KhprijuQv2sP4kT92sSQwhlK3SJTbDIsxcfIEySB0O+3m9esFOai7dP9bMx5enHAh2MwarVIcnwiWoOm01RIbQ==" + "integrity": "sha512-KhprijuQv2sP4kT92sSQwhlK3SJTbDIsxcfIEySB0O+3m9esFOai7dP9bMx5enHAh2MwarVIcnwiWoOm01RIbQ==", + "requires": {} }, "csso": { "version": "4.2.0", @@ -22229,9 +22307,9 @@ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" }, "data-uri-to-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", - "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==" }, "data-urls": { "version": "2.0.0", @@ -22555,24 +22633,21 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" }, "easymde": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/easymde/-/easymde-2.15.0.tgz", - "integrity": "sha512-9jMRIVvKt1d0UjRN45yotUYECAM4xvw0TTAQw8sYDONP++keWJVnd8Xrn+V+vQEN/v9/X0SWEoo1rFSgCooGpw==", + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/easymde/-/easymde-2.18.0.tgz", + "integrity": "sha512-IxVVUxNWIoXLeqtBU4BLc+eS/ScYhT1Dcb6yF5Wchoj1iXAV+TIIDWx+NCaZhY7RcSHqDPKllbYq7nwGKILnoA==", "requires": { - "@types/codemirror": "0.0.109", - "@types/marked": "^2.0.2", - "codemirror": "^5.61.0", + "@types/codemirror": "^5.60.4", + "@types/marked": "^4.0.7", + "codemirror": "^5.63.1", "codemirror-spell-checker": "1.1.2", - "marked": "^2.0.3" + "marked": "^4.1.0" }, "dependencies": { - "@types/codemirror": { - "version": "0.0.109", - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.109.tgz", - "integrity": "sha512-cSdiHeeLjvGn649lRTNeYrVCDOgDrtP+bDDSFDd1TF+i0jKGPDRozno2NOJ9lTniso+taiv4kiVS8dgM8Jm5lg==", - "requires": { - "@types/tern": "*" - } + "marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==" } } }, @@ -23076,7 +23151,8 @@ "eslint-plugin-react-hooks": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz", - "integrity": "sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw==" + "integrity": "sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw==", + "requires": {} }, "eslint-plugin-testing-library": { "version": "5.3.1", @@ -23127,11 +23203,6 @@ "schema-utils": "^3.1.1" } }, - "esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" - }, "espree": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", @@ -23382,9 +23453,13 @@ } }, "fetch-blob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-2.1.2.tgz", - "integrity": "sha512-YKqtUDwqLyfyMnmbw8XD6Q8j9i/HggKtPEI+pZ1+8bvheBu78biSmNaXWusx1TauGqtUUGx/cBb1mKdq2rLYow==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "requires": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + } }, "file-entry-cache": { "version": "6.0.1", @@ -23582,6 +23657,14 @@ } } }, + "formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "requires": { + "fetch-blob": "^3.1.2" + } + }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -24128,7 +24211,8 @@ "icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==" + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "requires": {} }, "idb": { "version": "6.1.5", @@ -24157,7 +24241,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", - "dev": true + "devOptional": true }, "import-fresh": { "version": "3.3.0", @@ -24867,7 +24951,8 @@ "jest-pnp-resolver": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "requires": {} }, "jest-react-hooks-shallow": { "version": "1.5.1", @@ -25110,6 +25195,12 @@ } } }, + "jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", + "peer": true + }, "js-cookie": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", @@ -25225,14 +25316,14 @@ } }, "jsonld": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/jsonld/-/jsonld-5.2.0.tgz", - "integrity": "sha512-JymgT6Xzk5CHEmHuEyvoTNviEPxv6ihLWSPu1gFdtjSAyM6cFqNrv02yS/SIur3BBIkCf0HjizRc24d8/FfQKw==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/jsonld/-/jsonld-8.3.2.tgz", + "integrity": "sha512-MwBbq95szLwt8eVQ1Bcfwmgju/Y5P2GdtlHE2ncyfuYjIdEhluUVyj1eudacf1mOkWIoS9GpDBTECqhmq7EOaA==", "requires": { - "@digitalbazaar/http-client": "^1.1.0", + "@digitalbazaar/http-client": "^3.4.1", "canonicalize": "^1.0.1", "lru-cache": "^6.0.0", - "rdf-canonize": "^3.0.0" + "rdf-canonize": "^3.4.0" } }, "jsonpointer": { @@ -25265,17 +25356,17 @@ "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==" }, "ky": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/ky/-/ky-0.25.1.tgz", - "integrity": "sha512-PjpCEWlIU7VpiMVrTwssahkYXX1by6NCT0fhTUX34F3DTinARlgMpriuroolugFPcMgpPWrOW4mTb984Qm1RXA==" + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/ky/-/ky-0.33.3.tgz", + "integrity": "sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==" }, "ky-universal": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/ky-universal/-/ky-universal-0.8.2.tgz", - "integrity": "sha512-xe0JaOH9QeYxdyGLnzUOVGK4Z6FGvDVzcXFTdrYA1f33MZdEa45sUDaMBy98xQMcsd2XIBrTXRrRYnegcSdgVQ==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/ky-universal/-/ky-universal-0.11.0.tgz", + "integrity": "sha512-65KyweaWvk+uKKkCrfAf+xqN2/epw1IJDtlyCPxYffFCMR8u1sp2U65NtWpnozYfZxQ6IUzIlvUcw+hQ82U2Xw==", "requires": { "abort-controller": "^3.0.0", - "node-fetch": "3.0.0-beta.9" + "node-fetch": "^3.2.10" } }, "language-subtag-registry": { @@ -25462,9 +25553,9 @@ } }, "marked": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/marked/-/marked-2.1.3.tgz", - "integrity": "sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA==" + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.6.tgz", + "integrity": "sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==" }, "mdast-util-definitions": { "version": "4.0.0", @@ -25758,13 +25849,19 @@ "tslib": "^2.0.3" } }, + "node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" + }, "node-fetch": { - "version": "3.0.0-beta.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.0.0-beta.9.tgz", - "integrity": "sha512-RdbZCEynH2tH46+tj0ua9caUHVWrd/RHnRfvly2EVdqGmI3ndS1Vn/xjm5KuGejDt2RNDQsVRLPNd2QPwcewVg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "requires": { - "data-uri-to-buffer": "^3.0.1", - "fetch-blob": "^2.1.1" + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" } }, "node-forge": { @@ -26288,7 +26385,8 @@ "postcss-browser-comments": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", - "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==" + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", + "requires": {} }, "postcss-calc": { "version": "8.2.4", @@ -26353,7 +26451,8 @@ "postcss-custom-media": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", - "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==" + "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", + "requires": {} }, "postcss-custom-properties": { "version": "12.1.4", @@ -26382,22 +26481,26 @@ "postcss-discard-comments": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.3.tgz", - "integrity": "sha512-6W5BemziRoqIdAKT+1QjM4bNcJAQ7z7zk073730NHg4cUXh3/rQHHj7pmYxUB9aGhuRhBiUf0pXvIHkRwhQP0Q==" + "integrity": "sha512-6W5BemziRoqIdAKT+1QjM4bNcJAQ7z7zk073730NHg4cUXh3/rQHHj7pmYxUB9aGhuRhBiUf0pXvIHkRwhQP0Q==", + "requires": {} }, "postcss-discard-duplicates": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.3.tgz", - "integrity": "sha512-vPtm1Mf+kp7iAENTG7jI1MN1lk+fBqL5y+qxyi4v3H+lzsXEdfS3dwUZD45KVhgzDEgduur8ycB4hMegyMTeRw==" + "integrity": "sha512-vPtm1Mf+kp7iAENTG7jI1MN1lk+fBqL5y+qxyi4v3H+lzsXEdfS3dwUZD45KVhgzDEgduur8ycB4hMegyMTeRw==", + "requires": {} }, "postcss-discard-empty": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.3.tgz", - "integrity": "sha512-xGJugpaXKakwKI7sSdZjUuN4V3zSzb2Y0LOlmTajFbNinEjTfVs9PFW2lmKBaC/E64WwYppfqLD03P8l9BuueA==" + "integrity": "sha512-xGJugpaXKakwKI7sSdZjUuN4V3zSzb2Y0LOlmTajFbNinEjTfVs9PFW2lmKBaC/E64WwYppfqLD03P8l9BuueA==", + "requires": {} }, "postcss-discard-overridden": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.4.tgz", - "integrity": "sha512-3j9QH0Qh1KkdxwiZOW82cId7zdwXVQv/gRXYDnwx5pBtR1sTkU4cXRK9lp5dSdiM0r0OICO/L8J6sV1/7m0kHg==" + "integrity": "sha512-3j9QH0Qh1KkdxwiZOW82cId7zdwXVQv/gRXYDnwx5pBtR1sTkU4cXRK9lp5dSdiM0r0OICO/L8J6sV1/7m0kHg==", + "requires": {} }, "postcss-double-position-gradients": { "version": "3.0.5", @@ -26418,7 +26521,8 @@ "postcss-flexbugs-fixes": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", - "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==" + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", + "requires": {} }, "postcss-focus-visible": { "version": "6.0.4", @@ -26439,12 +26543,14 @@ "postcss-font-variant": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==" + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "requires": {} }, "postcss-gap-properties": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz", - "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==" + "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==", + "requires": {} }, "postcss-image-set-function": { "version": "4.0.6", @@ -26457,7 +26563,8 @@ "postcss-initial": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==" + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "requires": {} }, "postcss-js": { "version": "4.0.0", @@ -26519,12 +26626,14 @@ "postcss-logical": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==" + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "requires": {} }, "postcss-media-minmax": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==" + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "requires": {} }, "postcss-merge-longhand": { "version": "5.0.6", @@ -26585,7 +26694,8 @@ "postcss-modules-extract-imports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==" + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "requires": {} }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -26642,7 +26752,8 @@ "postcss-normalize-charset": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.3.tgz", - "integrity": "sha512-iKEplDBco9EfH7sx4ut7R2r/dwTnUqyfACf62Unc9UiyFuI7uUqZZtY+u+qp7g8Qszl/U28HIfcsI3pEABWFfA==" + "integrity": "sha512-iKEplDBco9EfH7sx4ut7R2r/dwTnUqyfACf62Unc9UiyFuI7uUqZZtY+u+qp7g8Qszl/U28HIfcsI3pEABWFfA==", + "requires": {} }, "postcss-normalize-display-values": { "version": "5.0.3", @@ -26727,12 +26838,14 @@ "postcss-overflow-shorthand": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz", - "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==" + "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==", + "requires": {} }, "postcss-page-break": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==" + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "requires": {} }, "postcss-place": { "version": "7.0.4", @@ -26815,7 +26928,8 @@ "postcss-replace-overflow-wrap": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==" + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "requires": {} }, "postcss-selector-not": { "version": "5.0.0", @@ -26904,13 +27018,13 @@ "prettier": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.0.tgz", - "integrity": "sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==", - "dev": true + "integrity": "sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==" }, "prettier-plugin-tailwindcss": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.1.7.tgz", - "integrity": "sha512-tmBr45hCLuit2Cz9Pwow0/Jl1bGivYGsfcF29O+3sKcE++ybjz9dfie565S3ZsvAeV8uYer9SRMBWDsHPly2Lg==" + "integrity": "sha512-tmBr45hCLuit2Cz9Pwow0/Jl1bGivYGsfcF29O+3sKcE++ybjz9dfie565S3ZsvAeV8uYer9SRMBWDsHPly2Lg==", + "requires": {} }, "pretty-bytes": { "version": "5.6.0", @@ -27211,12 +27325,13 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/raw.macro/-/raw.macro-0.6.2.tgz", "integrity": "sha512-YWhyR420Xug/s6/7k+H8WTA0r84WULMPn0/o8Y5u5905tGjkvB72Fd/TvRXJcOiv7cSARUGzy+wCZPX9pr9YQA==", - "dev": true + "dev": true, + "requires": {} }, "rdf-canonize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-3.0.0.tgz", - "integrity": "sha512-LXRkhab1QaPJnhUIt1gtXXKswQCZ9zpflsSZFczG7mCLAkMvVjdqCGk9VXCUss0aOUeEyV2jtFxGcdX8DSkj9w==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-3.4.0.tgz", + "integrity": "sha512-fUeWjrkOO0t1rg7B2fdyDTvngj+9RlUyL92vOdiB7c0FPguWVsniIMjEtHH+meLBO9rzkUlUzBVXgWrjI8P9LA==", "requires": { "setimmediate": "^1.0.5" } @@ -27414,7 +27529,8 @@ "react-icons": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.9.0.tgz", - "integrity": "sha512-ijUnFr//ycebOqujtqtV9PFS7JjhWg0QU6ykURVHuL4cbofvRCf3f6GMn9+fBktEFQOIVZnuAYLZdiyadRQRFg==" + "integrity": "sha512-ijUnFr//ycebOqujtqtV9PFS7JjhWg0QU6ykURVHuL4cbofvRCf3f6GMn9+fBktEFQOIVZnuAYLZdiyadRQRFg==", + "requires": {} }, "react-intl": { "version": "6.4.4", @@ -27487,7 +27603,8 @@ "react-promise-tracker": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/react-promise-tracker/-/react-promise-tracker-2.1.1.tgz", - "integrity": "sha512-NM7FrJ4y5aRN3FIeVtmeF8leIDQIdYni9pleHTvuX6Kz5zsIHMYSNERmvzTxvPuzei0iNiNiudsXySP63TXA8A==" + "integrity": "sha512-NM7FrJ4y5aRN3FIeVtmeF8leIDQIdYni9pleHTvuX6Kz5zsIHMYSNERmvzTxvPuzei0iNiNiudsXySP63TXA8A==", + "requires": {} }, "react-redux": { "version": "8.0.7", @@ -27713,7 +27830,8 @@ "react-side-effect": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.1.tgz", - "integrity": "sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ==" + "integrity": "sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ==", + "requires": {} }, "react-simplemde-editor": { "version": "5.2.0", @@ -27726,12 +27844,14 @@ "react-spinners": { "version": "0.13.8", "resolved": "https://registry.npmjs.org/react-spinners/-/react-spinners-0.13.8.tgz", - "integrity": "sha512-3e+k56lUkPj0vb5NDXPVFAOkPC//XyhKPJjvcGjyMNPWsBKpplfeyialP74G7H7+It7KzhtET+MvGqbKgAqpZA==" + "integrity": "sha512-3e+k56lUkPj0vb5NDXPVFAOkPC//XyhKPJjvcGjyMNPWsBKpplfeyialP74G7H7+It7KzhtET+MvGqbKgAqpZA==", + "requires": {} }, "react-table": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/react-table/-/react-table-7.8.0.tgz", - "integrity": "sha512-hNaz4ygkZO4bESeFfnfOft73iBUj8K5oKi1EcSHPAibEydfsX2MyU6Z8KCr3mv3C9Kqqh71U+DhZkFvibbnPbA==" + "integrity": "sha512-hNaz4ygkZO4bESeFfnfOft73iBUj8K5oKi1EcSHPAibEydfsX2MyU6Z8KCr3mv3C9Kqqh71U+DhZkFvibbnPbA==", + "requires": {} }, "react-test-renderer": { "version": "17.0.2", @@ -27860,7 +27980,8 @@ "redux-thunk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", - "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==" + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "requires": {} }, "regenerate": { "version": "1.4.2", @@ -28176,7 +28297,7 @@ "version": "1.63.3", "resolved": "https://registry.npmjs.org/sass/-/sass-1.63.3.tgz", "integrity": "sha512-ySdXN+DVpfwq49jG1+hmtDslYqpS7SkOR5GpF6o2bmb1RL/xS+wvPmegMvMywyfsmAV6p7TgwXYGrCZIFFbAHg==", - "dev": true, + "devOptional": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -28366,7 +28487,7 @@ "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "setprototypeof": { "version": "1.2.0", @@ -28735,7 +28856,8 @@ "style-loader": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==" + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "requires": {} }, "style-to-object": { "version": "0.3.0", @@ -29325,8 +29447,7 @@ "typescript": { "version": "4.9.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", - "dev": true + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==" }, "typo-js": { "version": "1.2.1", @@ -29344,6 +29465,14 @@ "which-boxed-primitive": "^1.0.2" } }, + "undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "requires": { + "@fastify/busboy": "^2.0.0" + } + }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -29483,12 +29612,14 @@ "use-isomorphic-layout-effect": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", - "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==" + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "requires": {} }, "use-sync-external-store": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.1.0.tgz", - "integrity": "sha512-SEnieB2FPKEVne66NpXPd1Np4R1lTNKfjuy3XdIoPQKYBAFdzbzSZlSn1KJZUiihQLQC5Znot4SBz1EOTBwQAQ==" + "integrity": "sha512-SEnieB2FPKEVne66NpXPd1Np4R1lTNKfjuy3XdIoPQKYBAFdzbzSZlSn1KJZUiihQLQC5Znot4SBz1EOTBwQAQ==", + "requires": {} }, "util-deprecate": { "version": "1.0.2", @@ -29620,6 +29751,11 @@ "minimalistic-assert": "^1.0.0" } }, + "web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==" + }, "webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", @@ -29664,7 +29800,8 @@ "acorn-import-assertions": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==" + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "requires": {} }, "eslint-scope": { "version": "5.1.1", @@ -29829,7 +29966,8 @@ "ws": { "version": "8.5.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==" + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "requires": {} } } }, @@ -30242,7 +30380,8 @@ "ws": { "version": "7.5.7", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==" + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", + "requires": {} }, "xml": { "version": "1.0.1", diff --git a/package.json b/package.json index 5d168acc1..6f6222da8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "termit-ui", - "version": "3.1.2", + "version": "3.1.3", "private": true, "homepage": ".", "license": "GPL-3.0-only", @@ -16,14 +16,15 @@ "classnames": "^2.3.2", "dom-serializer": "^1.3.2", "domhandler": "^4.3.1", - "easymde": "2.15.0", + "easymde": "2.18.0", + "marked": "^9.1.6", "html-to-react": "1.5.0", "htmlparser2": "^4.1.0", "intelligent-tree-select": "0.11.4", "iso-639-1": "^2.1.15", "javascript-time-ago": "2.5.9", "js-cookie": "^3.0.5", - "jsonld": "5.2.0", + "jsonld": "8.3.2", "last": "^1.1.0", "ld-query": "^2.6.1", "lodash": "^4.17.21", @@ -48,7 +49,7 @@ "react-router-dom": "^5.3.0", "react-router-redux": "^4.0.8", "react-scripts": "5.0.1", - "react-simplemde-editor": "^5.0.2", + "react-simplemde-editor": "^5.2.0", "react-spinners": "^0.13.8", "react-table": "^7.8.0", "reactstrap": "^8.10.1", @@ -66,7 +67,7 @@ "start-mock-rest": "cross-env REACT_APP_MOCK_REST_API=true react-scripts start", "build": "react-scripts build", "test": "react-scripts test --env=jsdom --testPathPattern='.*\\.test\\.tsx?'", - "test-ci": "cross-env -CI=true react-scripts test --env=jsdom --testPathPattern='.*\\.test\\.tsx?' --testResultsProcessor='jest-junit'", + "test-ci": "cross-env -CI=true react-scripts test -w 8 --env=jsdom --testPathPattern='.*\\.test\\.tsx?' --testResultsProcessor='jest-junit'", "eject": "react-scripts eject", "build-prod": "npm run test-ci && npm run build", "analyze": "source-map-explorer 'build/static/js/*.js'", diff --git a/src/IntlApp.tsx b/src/IntlApp.tsx index 4670d0c04..931b2ad75 100644 --- a/src/IntlApp.tsx +++ b/src/IntlApp.tsx @@ -29,6 +29,10 @@ const IntlWrapper: React.FC = () => { component={ForgotPassword} /> + { const payload = {}; diff --git a/src/action/AsyncUserActions.ts b/src/action/AsyncUserActions.ts index 4e26d76d3..4d55b24ae 100644 --- a/src/action/AsyncUserActions.ts +++ b/src/action/AsyncUserActions.ts @@ -214,7 +214,7 @@ export function createNewUser(user: UserAccountData) { return (dispatch: ThunkDispatch) => { dispatch(asyncActionRequest(action)); return Ajax.post( - Constants.API_PREFIX + "/users", + Constants.API_PREFIX + "/admin/users", content(user).contentType("application/json") ) .then(() => dispatch(asyncActionSuccess(action))) @@ -460,3 +460,19 @@ export function loadManagedAssets(user: User) { }); }; } + +export function doesUsernameExists(username: string) { + const action = { type: ActionType.DOES_USERNAME_EXISTS }; + return (dispatch: ThunkDispatch) => { + dispatch(asyncActionRequest(action, true)); + return Ajax.get( + `${Constants.API_PREFIX}${USERS_ENDPOINT}/username`, + params({ username }) + ) + .then((data) => { + dispatch(asyncActionSuccess(action)); + return data === true; + }) + .catch((error: ErrorData) => dispatch(asyncActionFailure(action, error))); + }; +} diff --git a/src/action/SyncActions.ts b/src/action/SyncActions.ts index 7d81f9e76..eed90c60a 100644 --- a/src/action/SyncActions.ts +++ b/src/action/SyncActions.ts @@ -26,9 +26,15 @@ import { export function asyncActionRequest( a: Action, - ignoreLoading: boolean = false + ignoreLoading: boolean = false, + abortController?: AbortController ): AsyncAction { - return { ...a, status: AsyncActionStatus.REQUEST, ignoreLoading }; + return { + ...a, + status: AsyncActionStatus.REQUEST, + ignoreLoading, + abortController, + }; } export function asyncActionFailure( diff --git a/src/action/__tests__/AsyncActions.test.ts b/src/action/__tests__/AsyncActions.test.ts index 00713bcea..a1a071bbd 100644 --- a/src/action/__tests__/AsyncActions.test.ts +++ b/src/action/__tests__/AsyncActions.test.ts @@ -1,5 +1,6 @@ import configureMockStore, { MockStoreEnhanced } from "redux-mock-store"; import { + abortPendingActionRequest, createFileInDocument, createProperty, createVocabulary, @@ -9,6 +10,7 @@ import { getLabel, getProperties, hasFileContent, + isActionRequestPending, loadAllTerms, loadConfiguration, loadFileContent, @@ -99,10 +101,137 @@ describe("Async actions", () => { store = mockStore(new TermItState()); }); + describe("pending async actions", () => { + it("returns action request as pending when status is present", () => { + const state = { + pendingActions: { + // set some action as pending + [ActionType.LOAD_RESOURCES]: { status: AsyncActionStatus.REQUEST }, + }, + } as TermItState; + + const result = isActionRequestPending(state, { + type: ActionType.LOAD_RESOURCES, + }); + + expect(result).toBeTruthy(); + }); + + it("returns action request as pending when abort controller is present and signal is not aborted", () => { + const state = { + pendingActions: { + // set some action as pending + [ActionType.LOAD_RESOURCES]: { + status: AsyncActionStatus.REQUEST, + abortController: new AbortController(), + }, + }, + } as TermItState; + + const result = isActionRequestPending(state, { + type: ActionType.LOAD_RESOURCES, + }); + + expect(result).toBeTruthy(); + }); + + it("does not returns action request as pending when abort controller is present and signal is aborted", () => { + const controller = new AbortController(); + const state = { + pendingActions: { + // set some action as pending + [ActionType.LOAD_RESOURCES]: { + status: AsyncActionStatus.REQUEST, + abortController: controller, + }, + }, + } as TermItState; + + controller.abort(); + const result = isActionRequestPending(state, { + type: ActionType.LOAD_RESOURCES, + }); + + expect(result).toBeFalsy(); + }); + + it("does not returns action request as pending when action is not present", () => { + const state = { + pendingActions: {}, + } as TermItState; + + const result = isActionRequestPending(state, { + type: ActionType.LOAD_RESOURCES, + }); + + expect(result).toBeFalsy(); + }); + + it("aborts pending action request when abort controller is present", () => { + const controller = new AbortController(); + const state = { + pendingActions: { + // set some action as pending + [ActionType.LOAD_RESOURCES]: { + status: AsyncActionStatus.REQUEST, + abortController: controller, + }, + }, + } as TermItState; + + expect(controller.signal.aborted).toEqual(false); + abortPendingActionRequest(state, { + type: ActionType.LOAD_RESOURCES, + }); + + expect(controller.signal.aborted).toEqual(true); + }); + + it("does noting when pending action status is present instead of abort controller", () => { + const state = { + pendingActions: { + // set some action as pending + [ActionType.LOAD_RESOURCES]: { status: AsyncActionStatus.REQUEST }, + }, + } as TermItState; + + abortPendingActionRequest(state, { + type: ActionType.LOAD_RESOURCES, + }); + + expect(state).toEqual({ + pendingActions: { + [ActionType.LOAD_RESOURCES]: { status: AsyncActionStatus.REQUEST }, + }, + }); + }); + + it("does nothing when pending action controller is already aborted", () => { + const controller = new AbortController(); + const state = { + pendingActions: { + // set some action as pending + [ActionType.LOAD_RESOURCES]: { + status: AsyncActionStatus.REQUEST, + abortController: controller, + }, + }, + } as TermItState; + + controller.abort(); + expect(controller.signal.aborted).toEqual(true); + abortPendingActionRequest(state, { + type: ActionType.LOAD_RESOURCES, + }); + + expect(controller.signal.aborted).toEqual(true); + }); + }); + describe("create vocabulary", () => { it("adds context definition to vocabulary data and sends it over network", () => { const vocabulary = new Vocabulary({ - label: "Test", + label: langString("Test"), iri: "http://test", }); const mock = jest.fn().mockImplementation(() => Promise.resolve()); @@ -121,7 +250,7 @@ describe("Async actions", () => { it("reloads vocabularies on success", () => { const vocabulary = new Vocabulary({ - label: "Test", + label: langString("Test"), iri: "http://kbss.felk.cvut.cz/termit/rest/vocabularies/test", }); Ajax.post = jest @@ -176,8 +305,9 @@ describe("Async actions", () => { Promise.resolve(require("../../rest-mock/vocabulary")) ); - store.getState().pendingActions[ActionType.LOAD_VOCABULARY] = - AsyncActionStatus.REQUEST; + store.getState().pendingActions[ActionType.LOAD_VOCABULARY] = { + status: AsyncActionStatus.REQUEST, + }; return Promise.resolve( (store.dispatch as ThunkDispatch)( loadVocabulary({ fragment: "metropolitan-plan" }) @@ -323,7 +453,7 @@ describe("Async actions", () => { const namespace = "http://onto.fel.cvut.cz/ontologies/termit/vocabularies/"; it("sends delete vocabulary request to the server", () => { const vocabulary = new Vocabulary({ - label: "Test", + label: langString("Test"), iri: namespace + normalizedName, }); Ajax.delete = jest.fn().mockImplementation(() => Promise.resolve()); @@ -342,7 +472,7 @@ describe("Async actions", () => { it("refreshes vocabulary list on success", () => { const vocabulary = new Vocabulary({ - label: "Test", + label: langString("Test"), iri: namespace + normalizedName, }); Ajax.delete = jest.fn().mockImplementation(() => Promise.resolve()); @@ -359,7 +489,7 @@ describe("Async actions", () => { it("transitions to vocabulary management on success", () => { const vocabulary = new Vocabulary({ - label: "Test", + label: langString("Test"), iri: namespace + normalizedName, }); Ajax.delete = jest.fn().mockImplementation(() => Promise.resolve()); @@ -411,8 +541,9 @@ describe("Async actions", () => { it("does nothing when vocabularies loading action is already pending", () => { Ajax.get = jest.fn().mockImplementation(() => Promise.resolve([])); - store.getState().pendingActions[ActionType.LOAD_VOCABULARIES] = - AsyncActionStatus.REQUEST; + store.getState().pendingActions[ActionType.LOAD_VOCABULARIES] = { + status: AsyncActionStatus.REQUEST, + }; return Promise.resolve( (store.dispatch as ThunkDispatch)(loadVocabularies()) ).then(() => { @@ -457,8 +588,9 @@ describe("Async actions", () => { it("does nothing when file content loading action is already pending", () => { Ajax.get = jest.fn().mockImplementation(() => Promise.resolve([])); - store.getState().pendingActions[ActionType.LOAD_FILE_CONTENT] = - AsyncActionStatus.REQUEST; + store.getState().pendingActions[ActionType.LOAD_FILE_CONTENT] = { + status: AsyncActionStatus.REQUEST, + }; return Promise.resolve( (store.dispatch as ThunkDispatch)( loadFileContent({ fragment: "metropolitan-plan" }) @@ -894,7 +1026,7 @@ describe("Async actions", () => { const namespace = "http://onto.fel.cvut.cz/ontologies/termit/vocabularies/"; const termName = "test-term"; const vocabulary = new Vocabulary({ - label: "Test Vocabulary", + label: langString("Test Vocabulary"), iri: namespace + normalizedName, }); const term = new Term({ @@ -961,7 +1093,7 @@ describe("Async actions", () => { const normalizedVocabularyName = "test-vocabulary"; const vocabulary = new Vocabulary({ iri: namespace + normalizedVocabularyName, - label: "Test vocabulary", + label: langString("Test vocabulary"), }); const mock = jest.fn().mockImplementation(() => Promise.resolve()); Ajax.put = mock; @@ -982,7 +1114,7 @@ describe("Async actions", () => { it("sends JSON-LD of vocabulary argument to REST endpoint", () => { const vocabulary = new Vocabulary({ iri: Generator.generateUri(), - label: "Test vocabulary", + label: langString("Test vocabulary"), }); const mock = jest.fn().mockImplementation(() => Promise.resolve()); Ajax.put = mock; @@ -998,7 +1130,7 @@ describe("Async actions", () => { it("reloads vocabulary on successful update", () => { const vocabulary = new Vocabulary({ iri: Generator.generateUri(), - label: "Test vocabulary", + label: langString("Test vocabulary"), }); Ajax.put = jest.fn().mockImplementation(() => Promise.resolve()); return Promise.resolve( @@ -1014,7 +1146,7 @@ describe("Async actions", () => { it("dispatches success message on successful update", () => { const vocabulary = new Vocabulary({ iri: Generator.generateUri(), - label: "Test vocabulary", + label: langString("Test vocabulary"), }); Ajax.put = jest.fn().mockImplementation(() => Promise.resolve()); Ajax.get = jest.fn().mockImplementation(() => Promise.resolve()); @@ -1304,8 +1436,9 @@ describe("Async actions", () => { it("does nothing when loading action is already pending", () => { Ajax.get = jest.fn().mockImplementation(() => Promise.resolve([])); - store.getState().pendingActions[ActionType.FETCH_VALIDATION_RESULTS] = - AsyncActionStatus.REQUEST; + store.getState().pendingActions[ActionType.FETCH_VALIDATION_RESULTS] = { + status: AsyncActionStatus.REQUEST, + }; return Promise.resolve( (store.dispatch as ThunkDispatch)(validateVocabulary(v)) ).then(() => { @@ -1680,7 +1813,7 @@ describe("Async actions", () => { it("loads vocabulary history when asset is vocabulary", () => { const asset = new Vocabulary({ iri: Generator.generateUri(), - label: "Test vocabulary", + label: langString("Test vocabulary"), types: [VocabularyUtils.VOCABULARY], }); Ajax.get = jest.fn().mockResolvedValue([]); diff --git a/src/action/__tests__/AsyncAnnotatorActions.test.ts b/src/action/__tests__/AsyncAnnotatorActions.test.ts index a41d9e033..d9d5a16ac 100644 --- a/src/action/__tests__/AsyncAnnotatorActions.test.ts +++ b/src/action/__tests__/AsyncAnnotatorActions.test.ts @@ -48,8 +48,9 @@ describe("AsyncAnnotatorActions", () => { }); it("does not invoke Ajax when a request is already pending", () => { - store.getState().pendingActions[ActionType.ANNOTATOR_LOAD_TERMS] = - AsyncActionStatus.REQUEST; + store.getState().pendingActions[ActionType.ANNOTATOR_LOAD_TERMS] = { + status: AsyncActionStatus.REQUEST, + }; const terms = require("../../rest-mock/terms"); Ajax.get = jest.fn().mockResolvedValue(terms); return Promise.resolve( diff --git a/src/action/__tests__/AsyncUserActions.test.ts b/src/action/__tests__/AsyncUserActions.test.ts index 938b19c83..f21d3eebe 100644 --- a/src/action/__tests__/AsyncUserActions.test.ts +++ b/src/action/__tests__/AsyncUserActions.test.ts @@ -457,7 +457,7 @@ describe("AsyncUserActions", () => { ).then(() => { expect(Ajax.post).toHaveBeenCalled(); const args = (Ajax.post as jest.Mock).mock.calls[0]; - expect(args[0]).toEqual(`${Constants.API_PREFIX}/users`); + expect(args[0]).toEqual(`${Constants.API_PREFIX}/admin/users`); expect(args[1].getContent()).toEqual(userInfo); }); }); diff --git a/src/component/administration/user/CreateNewUser.tsx b/src/component/administration/user/CreateNewUser.tsx index 2d425a763..5904bc98a 100644 --- a/src/component/administration/user/CreateNewUser.tsx +++ b/src/component/administration/user/CreateNewUser.tsx @@ -6,16 +6,16 @@ import { ThunkDispatch } from "../../../util/Types"; import { createNewUser } from "../../../action/AsyncUserActions"; import Routing from "../../../util/Routing"; import Routes from "../../../util/Routes"; -import RegistrationForm from "../../register/RegistrationForm"; import AsyncActionStatus from "../../../action/AsyncActionStatus"; import { Card, CardBody } from "reactstrap"; import HeaderWithActions from "../../misc/HeaderWithActions"; import { useI18n } from "../../hook/useI18n"; +import CreateNewUserForm from "./CreateNewUserForm"; export const CreateNewUser: React.FC = () => { const { i18n } = useI18n(); const dispatch: ThunkDispatch = useDispatch(); - const onRegister = (userData: UserAccountData) => { + const onSubmit = (userData: UserAccountData) => { return dispatch(createNewUser(userData)).then((result) => { if ((result as AsyncFailureAction).status !== AsyncActionStatus.FAILURE) { Routing.transitionTo(Routes.administration); @@ -23,18 +23,13 @@ export const CreateNewUser: React.FC = () => { return Promise.resolve(result); }); }; - const onCancel = () => Routing.transitionTo(Routes.administration); return ( <> - + diff --git a/src/component/administration/user/CreateNewUserForm.tsx b/src/component/administration/user/CreateNewUserForm.tsx new file mode 100644 index 000000000..ecf65af1c --- /dev/null +++ b/src/component/administration/user/CreateNewUserForm.tsx @@ -0,0 +1,264 @@ +import * as React from "react"; +import { useEffect, useRef, useState } from "react"; +import { doesUsernameExists } from "../../../action/AsyncUserActions"; +import { useDispatch } from "react-redux"; +import { ThunkDispatch } from "../../../util/Types"; +import * as _ from "lodash"; +import ValidationResult, { + Severity, +} from "../../../model/form/ValidationResult"; +import Utils from "../../../util/Utils"; +import { useI18n } from "../../hook/useI18n"; +import PromiseTrackingMask from "../../misc/PromiseTrackingMask"; +import { + Button, + Col, + Collapse, + Container, + Form, + Row, + UncontrolledTooltip, +} from "reactstrap"; +import Toggle from "react-bootstrap-toggle"; +import { TOGGLE_STYLE } from "../../term/IncludeImportedTermsToggle"; +import { UserAccountData } from "../../../model/User"; +import Constants from "../../../util/Constants"; +import CustomInput from "../../misc/CustomInput"; + +interface CreateNewUserFormProps { + onSubmit: (userAccountData: UserAccountData) => void; +} + +const CreateNewUserForm: React.FC = (props) => { + const dispatch: ThunkDispatch = useDispatch(); + const { i18n } = useI18n(); + const { onSubmit } = props; + + const [firstName, setFirstName] = useState(""); + const [lastName, setLastName] = useState(""); + const [username, setUsername] = useState(""); + const [password, setPassword] = useState(""); + const [passwordConfirmation, setPasswordConfirmation] = useState(""); + const [usernameExists, setUsernameExists] = useState(false); + const [emailPassword, setEmailPassword] = useState(true); + + // ref is required to keep the same debounced function between renders + const fetchUsernameExists = useRef( + _.debounce((username) => { + dispatch(doesUsernameExists(username)).then((action) => { + if (_.isBoolean(action)) { + setUsernameExists(action); + } + }); + }, Constants.INPUT_DEBOUNCE_WAIT_TIME) + ).current; + + const onFormSubmit = () => { + if (!isValid()) { + return; + } + + onSubmit({ + firstName, + lastName, + username, + password: emailPassword ? "" : password, + }); + }; + + const onChange = ( + setter: (value: any) => void, + e: React.ChangeEvent + ) => { + setter(e.currentTarget.value); + }; + + const onKeyPress = (e: React.KeyboardEvent) => { + if (e.key === "Enter" && isValid()) { + onFormSubmit(); + } + }; + + const validateNonEmpty = useRef((value: string) => { + if (value == null || value.trim().length === 0) { + return undefined; + } + return ValidationResult.VALID; + }).current; + + const validateUsername = useRef( + (username: string, usernameExists?: boolean) => { + if (validateNonEmpty(username) !== ValidationResult.VALID) { + return undefined; + } + if (!Utils.isValidEmail(username)) { + return ValidationResult.blocker( + i18n("register.username.notValidEmail") + ); + } + if (usernameExists) { + return ValidationResult.blocker( + i18n("register.username-exists.tooltip") + ); + } + + return ValidationResult.VALID; + } + ).current; + + // on username change, contact API and check if username already exists + useEffect(() => { + if (validateUsername(username) === ValidationResult.VALID) { + fetchUsernameExists(username); + } + }, [username, validateUsername, fetchUsernameExists]); + + const validatePasswordConfirmation = () => { + if (password !== passwordConfirmation) { + return ValidationResult.blocker( + i18n("register.passwords-not-matching.tooltip") + ); + } + + return validateNonEmpty(passwordConfirmation); + }; + + const onEnterPasswordToggle = () => { + setEmailPassword(!emailPassword); + }; + + const isValid = () => { + const validationResults = [ + validateNonEmpty(firstName), + validateNonEmpty(lastName), + validateUsername(username, usernameExists), + ]; + if (!emailPassword) { + validationResults.push( + validateNonEmpty(password), + validatePasswordConfirmation() + ); + } + + // if there is at least one "false" value, the form is invalid + return !validationResults + // map validation results to booleans + .map((result) => result && result.severity === Severity.VALID) + // search "false" value + .includes(false); + }; + + return ( + + +
+ + + + + + + + + + + + + + + + {i18n( + "administration.users.create.password-toggle.tooltip." + + (emailPassword ? "user" : "admin") + )} + + + + + + + + + + + + + + +
+
+ ); +}; + +export default CreateNewUserForm; diff --git a/src/component/annotator/AnnotatorTermsSelector.tsx b/src/component/annotator/AnnotatorTermsSelector.tsx index 5579e20e9..a923902e4 100644 --- a/src/component/annotator/AnnotatorTermsSelector.tsx +++ b/src/component/annotator/AnnotatorTermsSelector.tsx @@ -1,4 +1,4 @@ -import React, { useRef } from "react"; +import React, { useMemo, useRef } from "react"; import { TermData } from "../../model/Term"; import { useSelector } from "react-redux"; // @ts-ignore @@ -33,17 +33,26 @@ const AnnotatorTermsSelector: React.FC = ({ const { annotatorTerms, vocabulary, terminalStates } = useSelector( (state: TermItState) => state ); + + const options = useMemo( + () => + processTermsForTreeSelect( + Utils.mapToArray(annotatorTerms), + [createTermNonTerminalStateMatcher(terminalStates)], + { flattenAncestors: true } + ), + [annotatorTerms, terminalStates] + ); + React.useEffect(() => { if (autoFocus) { setTimeout(() => treeSelect.current.focus(), 100); } }, [autoFocus, treeSelect]); + React.useEffect(() => { treeSelect.current.forceUpdate(); }, [treeSelect, intl.locale]); - const options = processTermsForTreeSelect(Utils.mapToArray(annotatorTerms), [ - createTermNonTerminalStateMatcher(terminalStates), - ]); return ( { const [showLegend, setShowLegend] = React.useState( BrowserStorage.get(Constants.STORAGE_ANNOTATOR_LEGEND_OPEN_KEY, "true") === "true" ); + const isAnyAnnotationHidden = useSelector((state: TermItState) => + state.annotatorLegendFilter.isAnyHidden() + ); const { i18n, locale } = useI18n(); const toggle = () => { setShowLegend(!showLegend); @@ -28,6 +36,27 @@ const LegendToggle = () => { String(!showLegend) ); }; + + const renderIcon = () => { + if (isAnyAnnotationHidden) { + return ; + } + + return ; + }; + + const renderTooltip = () => { + if (isAnyAnnotationHidden) { + return ( + + {i18n("annotator.legend.activeFilter.tooltip")} + + ); + } + + return null; + }; + return ( <> @@ -67,15 +96,17 @@ const LegendToggle = () => { + {renderTooltip()} ); }; diff --git a/src/component/factory/AssetLinkFactory.tsx b/src/component/factory/AssetLinkFactory.tsx index 93e62d3bf..eb30b87e0 100644 --- a/src/component/factory/AssetLinkFactory.tsx +++ b/src/component/factory/AssetLinkFactory.tsx @@ -6,6 +6,8 @@ import Term from "../../model/Term"; import { Label } from "reactstrap"; import VocabularyLink from "../vocabulary/VocabularyLink"; import Vocabulary from "../../model/Vocabulary"; +import Document from "../../model/Document"; +import DocumentLink from "../../model/DocumentLink"; export default class AssetLinkFactory { public static createAssetLink(asset: Asset): JSX.Element { @@ -14,6 +16,8 @@ export default class AssetLinkFactory { return ; case VocabularyUtils.VOCABULARY: return ; + case VocabularyUtils.DOCUMENT: + return ; default: return ; } diff --git a/src/component/forgotpassword/ForgotPassword.tsx b/src/component/forgotpassword/ForgotPassword.tsx index 08546384b..797b9aa67 100644 --- a/src/component/forgotpassword/ForgotPassword.tsx +++ b/src/component/forgotpassword/ForgotPassword.tsx @@ -74,7 +74,7 @@ export const ForgotPassword: React.FC<{}> = () => {

{Constants.APP_NAME}

-
{i18n("forgotPassword.subtitle")}
+
{i18n("forgotPassword.title")}
diff --git a/src/component/forgotpassword/ResetPassword.tsx b/src/component/forgotpassword/ResetPassword.tsx index 74b832fd2..66f28189c 100644 --- a/src/component/forgotpassword/ResetPassword.tsx +++ b/src/component/forgotpassword/ResetPassword.tsx @@ -8,7 +8,7 @@ import SecurityUtils from "../../util/SecurityUtils"; import PublicLayout from "../layout/PublicLayout"; import { resetPassword } from "../../action/AsyncUserActions"; import Constants from "../../util/Constants"; -import { Link, useParams } from "react-router-dom"; +import { Link, useParams, useRouteMatch } from "react-router-dom"; import WindowTitle from "../misc/WindowTitle"; import IfInternalAuth from "../misc/oidc/IfInternalAuth"; import EnhancedInput, { LabelDirection } from "../misc/EnhancedInput"; @@ -19,6 +19,7 @@ import { trackPromise } from "react-promise-tracker"; import PromiseTrackingMask from "../misc/PromiseTrackingMask"; import Messages from "../message/Messages"; import ChangePasswordDto from "../../model/ChangePasswordDto"; +import classNames from "classnames"; interface ResetPasswordGetParams { token: string; @@ -34,6 +35,9 @@ export const ResetPassword: React.FC = () => { const { i18n } = useI18n(); const { token, token_uri } = useParams(); + const isNewMatch = useRouteMatch(Routes.createPassword.path); + const isNew = isNewMatch != null; + const [password, setPassword] = React.useState(""); const [passwordConfirm, setpasswordConfirm] = React.useState(""); // will block UI once the request was successfully sent @@ -87,14 +91,17 @@ export const ResetPassword: React.FC = () => { }); }; + const id = (id: string): string => + (isNew ? "createPassword." : "resetPassword.") + id; + return ( - - + +

{Constants.APP_NAME}

-
{i18n("resetPassword.subtitle")}
+
{i18n(id("title"))}
@@ -103,20 +110,20 @@ export const ResetPassword: React.FC = () => { { className="btn-block" disabled={!arePasswordsEqualAndNotEmpty() || passwordChanged} > - {i18n("resetPassword.submit")} + {i18n(id("submit"))} -
+
( void; toggleModal: () => void; + languages: string[]; + language: string; } function isValid(data: { iri: string }) { @@ -31,36 +33,92 @@ function isValid(data: { iri: string }) { const CreatePropertyForm: React.FC = ({ onOptionCreate, toggleModal, + languages, + language, }) => { const { i18n } = useI18n(); const [iri, setIri] = useState(""); - const [label, setLabel] = useState(""); - const [comment, setComment] = useState(""); - const language = useSelector( - (state: TermItState) => state.configuration.language - ); + const [label, setLabel] = useState({} as MultilingualString); + const [comment, setComment] = useState({} as MultilingualString); + const [modalLanguages, setModalLanguages] = useState([...languages]); + const [modalLanguage, setModalLanguage] = useState(language); + + const optimizeOrUndefined = (string: MultilingualString) => { + const optimized = Object.assign({}, string); + Object.keys(string).forEach((lang) => { + if (string[lang] && string[lang].trim() === "") { + delete optimized[lang]; + } + }); + if (Object.keys(optimized).length === 0) { + return undefined; + } + return optimized; + }; + const onCreate = () => { toggleModal(); + const newProperty: RdfsResourceData = { iri, - label: label!.length > 0 ? langString(label, language) : undefined, - comment: comment!.length > 0 ? langString(comment, language) : undefined, + label: optimizeOrUndefined(label), + comment: optimizeOrUndefined(comment), types: [VocabularyUtils.RDF_PROPERTY], }; onOptionCreate(newProperty); }; + const setMultilingualString = ( + str: MultilingualString, + setter: (value: MultilingualString) => void, + value: string + ) => { + const copy = Object.assign({}, str); + copy[modalLanguage] = value; + setter(copy); + }; + + const removeTranslation = (lang: string) => { + const newLabel = Object.assign({}, label); + delete newLabel[lang]; + setLabel(newLabel); + + const newComment = Object.assign({}, comment); + delete newComment[language]; + setComment(newComment); + + const newModalLanguages = modalLanguages.filter((l) => l !== lang); + setModalLanguages(newModalLanguages); + }; + + const withMultilingualIcon = (text: string) => ( + <> + {text} + + + ); + return ( {i18n("properties.edit.new")} + + + setIri(e.currentTarget.value)} hint={i18n("required")} /> @@ -68,8 +126,11 @@ const CreatePropertyForm: React.FC = ({ setLabel(e.currentTarget.value)} + label={withMultilingualIcon(i18n("properties.edit.new.label"))} + value={label[modalLanguage] || ""} + onChange={(e) => + setMultilingualString(label, setLabel, e.currentTarget.value) + } hint={i18n("required")} /> @@ -77,8 +138,15 @@ const CreatePropertyForm: React.FC = ({