From 7931b742c6d86566da7bbe1bec7ac56fc5409e26 Mon Sep 17 00:00:00 2001 From: olloz26 Date: Wed, 30 Oct 2024 13:40:38 +0100 Subject: [PATCH] feat!: add documentation to projects fix import order (by using npm) feat!: add documentation to projects (next try) feat!: add documentation to projects (next try) fix: make the "global" variable also available in production fix: correct a test fix: correct the character count during source editing fix: correct the build fix: correct spaces fix: correct the button group feat!: add documentation to projects (next try) feat: increase the documentation character limit fix: typo feat: refactor the editor toolbar fix: correct the responsiveness --- client/.eslintrc.json | 4 + client/index.html | 3 + client/package-lock.json | 1091 ++++++++++++++++- client/package.json | 9 +- client/src/components/buttons/Button.tsx | 98 +- client/src/components/form-field/CkEditor.jsx | 273 ++++- .../form-field/LazyCkEditorRenderer.tsx | 35 + .../components/form-field/TextAreaInput.tsx | 105 +- client/src/components/form-field/ckEditor.css | 8 + .../src/components/formlabels/FormLabels.tsx | 4 +- .../ProjectPageContainer.tsx | 1 + .../Documentation/Documentation.tsx | 157 +++ .../ProjectOverviewPage.tsx | 4 + client/vite.config.ts | 10 +- tests/.eslintrc.json | 2 +- tests/cypress/e2e/projectDatasets.spec.ts | 6 +- tests/cypress/e2e/projectV2setup.spec.ts | 25 +- .../read-projectV2-without-documentation.json | 14 + .../fixtures/projectV2/read-projectV2.json | 1 + tests/cypress/support/commands/datasets.ts | 8 +- 20 files changed, 1722 insertions(+), 136 deletions(-) create mode 100644 client/src/components/form-field/LazyCkEditorRenderer.tsx create mode 100644 client/src/components/form-field/ckEditor.css create mode 100644 client/src/features/ProjectPageV2/ProjectPageContent/Documentation/Documentation.tsx create mode 100644 tests/cypress/fixtures/projectV2/read-projectV2-without-documentation.json diff --git a/client/.eslintrc.json b/client/.eslintrc.json index 47799514f3..3dccc2141e 100644 --- a/client/.eslintrc.json +++ b/client/.eslintrc.json @@ -93,6 +93,7 @@ "apiversion", "ascii", "asciimath", + "autoformat", "autosave", "autosaved", "autosaves", @@ -106,6 +107,7 @@ "bool", "booleans", "borderless", + "bulleted", "calc", "cancellable", "cancelled", @@ -257,6 +259,7 @@ "stdout", "stockimages", "storages", + "strikethrough", "swiper", "tada", "telepresence", @@ -264,6 +267,7 @@ "thead", "toastify", "toggler", + "tokenizer", "tolerations", "toml", "tooltip", diff --git a/client/index.html b/client/index.html index 3e1a0628ba..77bfb7bb4e 100644 --- a/client/index.html +++ b/client/index.html @@ -42,6 +42,9 @@
+ diff --git a/client/package-lock.json b/client/package-lock.json index 7c91d093b2..d572b6b6f2 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -8,18 +8,23 @@ "name": "renku-ui", "version": "3.46.1", "dependencies": { - "@ckeditor/ckeditor5-react": "^5.1.0", + "@ckeditor/ckeditor5-build-classic": "43.1.1", + "@ckeditor/ckeditor5-list": "43.1.1", + "@ckeditor/ckeditor5-react": "^9.3.0", + "@ckeditor/ckeditor5-word-count": "43.1.1", + "@ckeditor/vite-plugin-ckeditor5": "^0.1.3", "@fortawesome/fontawesome-svg-core": "^1.2.35", "@fortawesome/free-brands-svg-icons": "^5.15.3", "@fortawesome/free-regular-svg-icons": "^5.15.3", "@fortawesome/free-solid-svg-icons": "^5.15.3", "@fortawesome/react-fontawesome": "^0.2.0", + "@isaul32/ckeditor5-math": "43.1.1", "@popperjs/core": "^2.11.8", "@reduxjs/toolkit": "^1.9.7", - "@renku/ckeditor5-build-renku": "0.0.6", "@sentry/react": "^7.119.1", "ajv": "^6.12.6", "bootstrap": "^5.3.3", + "ckeditor5": "43.1.1", "classnames": "^2.3.2", "cookieconsent": "^3.1.1", "d3": "^7.9.0", @@ -2386,20 +2391,774 @@ "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz", "integrity": "sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==" }, + "node_modules/@ckeditor/ckeditor5-adapter-ckfinder": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-adapter-ckfinder/-/ckeditor5-adapter-ckfinder-43.1.1.tgz", + "integrity": "sha512-DCR98QdQKCYCQFT23CwR6PFLPLT3rlh89++hFIhUpykDz2pljEDC8uFNWjKY+b/5/P/jkTICLtt8+DlF8aN+/Q==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-upload": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-alignment": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-alignment/-/ckeditor5-alignment-43.1.1.tgz", + "integrity": "sha512-mjQPDmfPgKbMQp8JCR7Vg7MpRax44tSrtyoofSl/oMKDh2bXtwEnMKJlv501scl95S8VN2Pfnxj5+31N89j0Xg==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-autoformat": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-autoformat/-/ckeditor5-autoformat-43.1.1.tgz", + "integrity": "sha512-/NP29+d5y+AcffZEBJqH42Bj/M76OuBPG3DNEz9XEBbF9ADC9jqb2pYzDgiit/9VukNDtoLJjQ6HGxjdwzdLfg==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-typing": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-autosave": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-autosave/-/ckeditor5-autosave-43.1.1.tgz", + "integrity": "sha512-GYeEF0NL0KLS33lZ4Uc4R2hAofTH+EE/Pulzg1V0rSIPghLNULsvMRiqe6PnzYDKtD5et1YpaIZRp55DGzJ/gQ==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-basic-styles": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-basic-styles/-/ckeditor5-basic-styles-43.1.1.tgz", + "integrity": "sha512-xFfL6JaVkkNRnFET/ld6MGvbifFxJY8bv3zvAAlphXsCBxNDH9cZWzG605PF6SYTucCUXD4dtW0teLMmdzklaQ==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-typing": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-block-quote": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-block-quote/-/ckeditor5-block-quote-43.1.1.tgz", + "integrity": "sha512-VYZlQisRptiiqVRnMVBcwc3yRilpSoFTKiMXTzrYukUZLhPL6fiWVeMe/N9ygtdtGp3oYF/rSNv9H/8e6nNVYw==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-enter": "43.1.1", + "@ckeditor/ckeditor5-typing": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-build-classic": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-build-classic/-/ckeditor5-build-classic-43.1.1.tgz", + "integrity": "sha512-yCg+5u2ihdunYxieHsgHWACXbTMQZajy23wtGAuED7Tv+Uf41XPmBmQLoXSY43LyQOeSNvgEFdb6lUrl5Gi05w==", + "dependencies": { + "@ckeditor/ckeditor5-adapter-ckfinder": "43.1.1", + "@ckeditor/ckeditor5-autoformat": "43.1.1", + "@ckeditor/ckeditor5-basic-styles": "43.1.1", + "@ckeditor/ckeditor5-block-quote": "43.1.1", + "@ckeditor/ckeditor5-ckbox": "43.1.1", + "@ckeditor/ckeditor5-ckfinder": "43.1.1", + "@ckeditor/ckeditor5-cloud-services": "43.1.1", + "@ckeditor/ckeditor5-easy-image": "43.1.1", + "@ckeditor/ckeditor5-editor-classic": "43.1.1", + "@ckeditor/ckeditor5-essentials": "43.1.1", + "@ckeditor/ckeditor5-heading": "43.1.1", + "@ckeditor/ckeditor5-image": "43.1.1", + "@ckeditor/ckeditor5-indent": "43.1.1", + "@ckeditor/ckeditor5-link": "43.1.1", + "@ckeditor/ckeditor5-list": "43.1.1", + "@ckeditor/ckeditor5-media-embed": "43.1.1", + "@ckeditor/ckeditor5-paragraph": "43.1.1", + "@ckeditor/ckeditor5-paste-from-office": "43.1.1", + "@ckeditor/ckeditor5-table": "43.1.1", + "@ckeditor/ckeditor5-typing": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-ckbox": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ckbox/-/ckeditor5-ckbox-43.1.1.tgz", + "integrity": "sha512-2suCDhe5HlutZz52iBXRaVAcht/E4wBdZsF6ZL+hELNuqvYM2PCb2/FZTtxQb50mDlWtJtLidRc49COAr0k1QA==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-upload": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "blurhash": "2.0.5", + "ckeditor5": "43.1.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-ckfinder": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ckfinder/-/ckeditor5-ckfinder-43.1.1.tgz", + "integrity": "sha512-f5N9FtJTSRfEUaJqr0LpekoSAIMktyiwbWeGQhbYseCCV0+Qsw6W/wzuWMFNe5GELg0R/0tG0H59/2m1wTFFbw==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-clipboard": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-clipboard/-/ckeditor5-clipboard-43.1.1.tgz", + "integrity": "sha512-QF0zyq/NhLFm8V/VBBn+RWjiaAd5eyeCKz7zQKyBcSW27IaazAnG0+HHZeydZkT4vntad71t6bi6ZWzL/MJxwg==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "@ckeditor/ckeditor5-widget": "43.1.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-cloud-services": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-cloud-services/-/ckeditor5-cloud-services-43.1.1.tgz", + "integrity": "sha512-YprETdoRcu/2yxVCuoOrY+f4G0Qus0hIMfMuRZ9jbFWDDwZgHiXrFXvE0W9o9N51rKffWnTbs0GljsaXVit1+g==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-code-block": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-code-block/-/ckeditor5-code-block-43.1.1.tgz", + "integrity": "sha512-Nil+MNeirroHop5Onj23L2v17Jokgc6wvJYqzH+85OvlrJeEsfFauxlW+S6TI3ypZT04yLJ0zdpaZ/FYC5+NxA==", + "dependencies": { + "@ckeditor/ckeditor5-clipboard": "43.1.1", + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-enter": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-core": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-43.1.1.tgz", + "integrity": "sha512-qtbnD+24dK+ANVUgs+unZ0qX64NA0eG6k344q8fhXuHdPRKk55BDkjdmpv/Fh9Y0beo9EDqUPE/P7agv8lucBg==", + "dependencies": { + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "@ckeditor/ckeditor5-watchdog": "43.1.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-easy-image": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-easy-image/-/ckeditor5-easy-image-43.1.1.tgz", + "integrity": "sha512-BSiqxe6rFzNIROz7uny8SyGndQX070hlktJT5sQNO46lB+tsyFScUVXjzduSlm2fCG/2PFA83skR3/7cTAkBbg==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-upload": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-editor-balloon": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-editor-balloon/-/ckeditor5-editor-balloon-43.1.1.tgz", + "integrity": "sha512-hIfocf3a/zXj1SLElF58LIVXOP3GphpajrsNXysSxccb4LNUQjvqMqwYaHDkib0Oh4AznsCwfBE3CJ3grUiI4g==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-editor-classic": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-editor-classic/-/ckeditor5-editor-classic-43.1.1.tgz", + "integrity": "sha512-8/yuGbTtY/BF4Oi5wDd9/NHNmIvtb+f5YvqSkG7ZtWy0M+uHru8xM7hhUqUKwrG2jVxB2MFRcDGAE0YlVqs98Q==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-editor-decoupled": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-editor-decoupled/-/ckeditor5-editor-decoupled-43.1.1.tgz", + "integrity": "sha512-Vs7yVUjOM+QiwnS6v987YGen0xwku07pQyhl+ihW6cphJymaJ/kPNvkR2ZCfE5e/Av0ckz14DQj4vOmotx+Vxg==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-editor-inline": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-editor-inline/-/ckeditor5-editor-inline-43.1.1.tgz", + "integrity": "sha512-6rNUJPG23c0Nm4cbb5ReYiARhBk8crdpkYig6sR+8m//ah9SzO0H4H/brHtYHsV6FxOYDwxEJdaMSDP7rWUwkQ==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-editor-multi-root": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-editor-multi-root/-/ckeditor5-editor-multi-root-43.1.1.tgz", + "integrity": "sha512-M1NBPFLZZAVJt22Ipy/JYTeOPPGCRDy3nWnCoBR2U79/FkEQNRyUtkR58EA4dLHdaeAiaWX8w7z2DrLKxOUltw==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-engine": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-43.1.1.tgz", + "integrity": "sha512-gOqbGwEqbJDgbSRM0Dv3ArQRGTmX2pySNdQIseLnENVaq9r5FUu9T2moKYJbGl8t/DIqBAxOtdHQPafrXtk7yg==", + "dependencies": { + "@ckeditor/ckeditor5-utils": "43.1.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-enter": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-enter/-/ckeditor5-enter-43.1.1.tgz", + "integrity": "sha512-7JjNCe4qVtiLgnGC8P5WJzcDGTOXzgpos8nPSR52vsqNANNZQ/iAByDoPP7WCIijJHHjeFoBk0ytk2qfXppjkw==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-essentials": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-essentials/-/ckeditor5-essentials-43.1.1.tgz", + "integrity": "sha512-qbo080qotWmq19SnUkFspT9swHy2160nHFOdtx4LrQtGPbjSzS2EBFNHmkf31gUmEcNZCbegSIl0UT5IvIIV8g==", + "dependencies": { + "@ckeditor/ckeditor5-clipboard": "43.1.1", + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-enter": "43.1.1", + "@ckeditor/ckeditor5-select-all": "43.1.1", + "@ckeditor/ckeditor5-typing": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-undo": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-find-and-replace": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-find-and-replace/-/ckeditor5-find-and-replace-43.1.1.tgz", + "integrity": "sha512-BmSwyTsL5fAo4I2gRq7gzbU+WNAoaxWOPZCip/cGNdqzV9Utl6kTLx/DdxAhh8B4KTj8Rqv8Cmg1862HMkfKkw==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-font": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-font/-/ckeditor5-font-43.1.1.tgz", + "integrity": "sha512-QQrLf3zWp1T0QttKdFoC/fbEF69hzsHxNzmOeGVwAavgW0qpbpSEvTT5kRHm1tYlGeSR8N6/SVXgb4xHUxwvHg==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-heading": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-heading/-/ckeditor5-heading-43.1.1.tgz", + "integrity": "sha512-Gr4rxChoamevxNf/6DKRYltOcLuCqrqFOCWrOO00JRHN8dHW81TgMJVGf4xeM4bAlFbMSqM3Y2vRCPhtdTAarA==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-paragraph": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-highlight": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-highlight/-/ckeditor5-highlight-43.1.1.tgz", + "integrity": "sha512-hrzzTQ1tAHIUGdNingpyMsrBeb3herfSMXOGylkkTqg/SqtnUlVJbPZ8NVUrmlw6hQQMl7HDqBJGdHoesvB8TA==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-horizontal-line": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-horizontal-line/-/ckeditor5-horizontal-line-43.1.1.tgz", + "integrity": "sha512-FLTTPShC+/E/fAUYAxyMHOLDYCYAAuB3eXHonPekXjiAdkhchPibkIz0c3DgdjRGFhfGE4/XQ4PyU5oa5BKt5w==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-widget": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-html-embed": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-html-embed/-/ckeditor5-html-embed-43.1.1.tgz", + "integrity": "sha512-ggOFwmpNAiT0nwm/++GZR/9V256mHxA0l7riL422l9YOSToGf5kukemsc7PIifuNoBXCzFrkNipr53ctxZkomA==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "@ckeditor/ckeditor5-widget": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-html-support": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-html-support/-/ckeditor5-html-support-43.1.1.tgz", + "integrity": "sha512-eF2eZU6sbU0ml+z8nSd7cDhk3ihrV9R7gih/bWOGvWa94bpaNVOd4c7e3F0ZPQVlxfwT1X99Y7aDNSNcbWs53A==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-enter": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "@ckeditor/ckeditor5-widget": "43.1.1", + "ckeditor5": "43.1.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-image": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-image/-/ckeditor5-image-43.1.1.tgz", + "integrity": "sha512-6xOJsG9nYIIpwf/Kj0MARts5KK+eZ+awpAvljYgx+xjII4KEAO1dKSKjX5Fmx3zjDWieJelbLit9tvQTcqyq8A==", + "dependencies": { + "@ckeditor/ckeditor5-clipboard": "43.1.1", + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-typing": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-undo": "43.1.1", + "@ckeditor/ckeditor5-upload": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "@ckeditor/ckeditor5-widget": "43.1.1", + "ckeditor5": "43.1.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-indent": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-indent/-/ckeditor5-indent-43.1.1.tgz", + "integrity": "sha512-8UjEX0TlnQgxzRkIAwJMcrc4rQSrpFuxUmo4b4xWIuzTg2p/+XdmDebi1p0AekB14ZW9J4UjB0U8NTWJQ++NyA==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-integrations-common": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-integrations-common/-/ckeditor5-integrations-common-2.2.0.tgz", + "integrity": "sha512-qH68tqgyMibuejo+VAJ+iSH3ZmZweqBEzaawv9hZb4zzSMkBityWBjSc2hKXMtmJgCNsbSK84cyHpa5J/MNyLg==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "ckeditor5": ">=42.0.0 || ^0.0.0-nightly" + } + }, + "node_modules/@ckeditor/ckeditor5-language": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-language/-/ckeditor5-language-43.1.1.tgz", + "integrity": "sha512-lNqZn3rTmGDPEvZwAZZF6R1CkhnAh0cPXU4kuIs0+sshUcWGTQTO1l38Qzr4BGLrH1u7S2OilDe5GwfujF2vaA==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-link": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-link/-/ckeditor5-link-43.1.1.tgz", + "integrity": "sha512-pk/ginodZGD8H5ezH9uhPjV7bK2wKkx80Eno9pt/c05+rsrHOjcibrS+SXBQ6qbK/W6Zo9ZUFwWC9HyNIiCwqA==", + "dependencies": { + "@ckeditor/ckeditor5-clipboard": "43.1.1", + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-typing": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "@ckeditor/ckeditor5-widget": "43.1.1", + "ckeditor5": "43.1.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-list": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-list/-/ckeditor5-list-43.1.1.tgz", + "integrity": "sha512-hH9Ny4TRH87Iz7WDw8eVKHFFmY4sOrlbPcXutcZCfYGuiDGAvRaeinAwitnWwy+bs5mAdQcw/araWAgMoVbEpw==", + "dependencies": { + "@ckeditor/ckeditor5-clipboard": "43.1.1", + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-enter": "43.1.1", + "@ckeditor/ckeditor5-typing": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-markdown-gfm": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-markdown-gfm/-/ckeditor5-markdown-gfm-43.1.1.tgz", + "integrity": "sha512-7hnOEZdow1/aR69RXqTPoTczyAeIkjwYxgXbvt+pWgtJinuGtW97pc2X6ZSivsq+SWa+6UCe3TnzbyUrIdcqzA==", + "dependencies": { + "@ckeditor/ckeditor5-clipboard": "43.1.1", + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "ckeditor5": "43.1.1", + "marked": "4.0.12", + "turndown": "7.2.0", + "turndown-plugin-gfm": "1.0.2" + } + }, + "node_modules/@ckeditor/ckeditor5-media-embed": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-media-embed/-/ckeditor5-media-embed-43.1.1.tgz", + "integrity": "sha512-MEydmh/mNUpMpNNV6BDWK8pCC5qn++WPDyDMYSFi9bX8hr9EC7AufoNG+Lh46vEnPl49cAy18WZvlyoX7nCyCA==", + "dependencies": { + "@ckeditor/ckeditor5-clipboard": "43.1.1", + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-typing": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-undo": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "@ckeditor/ckeditor5-widget": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-mention": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-mention/-/ckeditor5-mention-43.1.1.tgz", + "integrity": "sha512-ErKPpapKx7HXTDgfGg6h3IRac70gCn6cwLIfuSiJ3bg8DSV5q7Rbi5UG8fRdOiT3mu/ZWI7gdP0ei6t/R6ddeA==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-typing": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-minimap": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-minimap/-/ckeditor5-minimap-43.1.1.tgz", + "integrity": "sha512-igsONpmmJse/RY/3ZAbtp5mlUzFHHAnFvUaNDPpWVDZ67sSJfCurAJqkrA9zzz4+pErdpryms067c5TAp8H9OQ==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-page-break": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-page-break/-/ckeditor5-page-break-43.1.1.tgz", + "integrity": "sha512-QuY6TYsgDZfeYWw4CZGgUs/3B2gHq4GmfSO4RuOMaQYPPnFOPFlyHEst9LDE6BbAa9ZWCdGlvUVxCfuAEDueww==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-widget": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-paragraph": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-paragraph/-/ckeditor5-paragraph-43.1.1.tgz", + "integrity": "sha512-9ehs/b2K95W0KPDKwnfxDYHs4ypOtDNT4yB/ZGkJP96NV5XJGGQVBJIVmq0HrMGh4thdwJWofq7ZBIBjN3HMwQ==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-paste-from-office": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-paste-from-office/-/ckeditor5-paste-from-office-43.1.1.tgz", + "integrity": "sha512-dMftOM7eFMqFFZGdzo04PalimSQgNnbAp4adiVVSQDQ9reenWJD9iE1VCT4C5MnX3q4MXGAIBmqOubsqwfI84g==", + "dependencies": { + "@ckeditor/ckeditor5-clipboard": "43.1.1", + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "ckeditor5": "43.1.1" + } + }, "node_modules/@ckeditor/ckeditor5-react": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-react/-/ckeditor5-react-5.1.0.tgz", - "integrity": "sha512-7+okLprneCOD/zXceiONstUjRQtMSnsYiW7C2uODgXpglYDANw9QbAoyA4+M0ZC2Sjxok56YPy46F7uXB+a6mA==", - "hasInstallScript": true, + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-react/-/ckeditor5-react-9.3.1.tgz", + "integrity": "sha512-2lc1ICGCOZ0loC6DeMFwhkhrodLYUsOnC2wdgMiaXnEWRI/fU0SWBAoLbsMH7i6zpq29s+ZWMEImRVbly8SmEA==", "dependencies": { + "@ckeditor/ckeditor5-integrations-common": "^2.1.0", "prop-types": "^15.7.2" }, "engines": { - "node": ">=14.0.0", - "npm": ">=5.7.1" + "node": ">=18.0.0" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0 || ^18.0.0" + "ckeditor5": ">=42.0.0 || ^0.0.0-nightly", + "react": "^16.13.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@ckeditor/ckeditor5-remove-format": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-remove-format/-/ckeditor5-remove-format-43.1.1.tgz", + "integrity": "sha512-LhzNvdJ3SrynhCN0BwAmjG1wNcPFy0nYgraS6Nj+P57up64EzDMCsJZ5EY7SsDgtm1rCRZh8liHfbY/6DLz6Ng==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-restricted-editing": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-restricted-editing/-/ckeditor5-restricted-editing-43.1.1.tgz", + "integrity": "sha512-QwDclw+HEYxJ3uLP0VNo+L0YMhv8uc/6RflEkh2E2w/keiPVrE41vzrAW/G0VD85MMVMdUrmYi98soDPsvZGVA==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-select-all": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-select-all/-/ckeditor5-select-all-43.1.1.tgz", + "integrity": "sha512-NAxjt604pS6LcEsmH+yMHphrUAV6koACwauyj9llfZErd+VWlzsComiqgEN0ZbZ+iVCem4Fl+TT/82rTcGgtbg==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-show-blocks": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-show-blocks/-/ckeditor5-show-blocks-43.1.1.tgz", + "integrity": "sha512-vb9FCIAnWZ0E161x7ulJPtLKtvxI+Rxv8qAikGNrbvLr6x9U9j0Y7WnLtmoYUozKIsRPQ2zFl7qciv1dPoeJTA==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-source-editing": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-source-editing/-/ckeditor5-source-editing-43.1.1.tgz", + "integrity": "sha512-NH5TSZJjroUk9u1eQBlGNSnHvcesednao+YeicZQzRBvPMqIV+6J+MdMj65hlqyfbEsbeHrIKCdMLo/H28+4ZA==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-theme-lark": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-special-characters": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-special-characters/-/ckeditor5-special-characters-43.1.1.tgz", + "integrity": "sha512-PQ4E0Rn7dxftM/h6zRLFptrD2xgMHXUVRZJuV6iejK+C/fVAM51PWOOUGUAPKWH1tY2bryiqdxF3yNyU2fpC4w==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-typing": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-style": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-style/-/ckeditor5-style-43.1.1.tgz", + "integrity": "sha512-sDrM3lCNlx9QdZaEeRUjf/ukO3sIriRn3dNs/6n6+pGJThlzju3/ikryywJ5AfxzmpCK7CVx1H2x2R9krSV4PQ==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-typing": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-table": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-table/-/ckeditor5-table-43.1.1.tgz", + "integrity": "sha512-rm7RcyYdhKlokBPxianNJSVdAQS7ng9T8UMbc7wJBVIEUXgqbqQ57nGm4IIX59FXSA7H9Dj/EFW4DT9YAaITvg==", + "dependencies": { + "@ckeditor/ckeditor5-clipboard": "43.1.1", + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "@ckeditor/ckeditor5-widget": "43.1.1", + "ckeditor5": "43.1.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-theme-lark": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-theme-lark/-/ckeditor5-theme-lark-43.1.1.tgz", + "integrity": "sha512-7huWGsetISvNOzQurO1zqLL25YnGP3vgsOysKHz0qKgOi+UwXWxG8IYnzHi0qN4ox78vgyCR+nJvzjVz33gJEg==", + "dependencies": { + "@ckeditor/ckeditor5-ui": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-typing": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-typing/-/ckeditor5-typing-43.1.1.tgz", + "integrity": "sha512-2YB3IfGPWct1oIlYGCL5Z5JQ/g2dpn8zr9syVTQJ/fAPjqi8Ig53lTaCQvpftnq4I+jESXAl4Rr9bIosqDVjAQ==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-ui": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-43.1.1.tgz", + "integrity": "sha512-GNf0y56cT1HzgaG8wPyNsXlG4lZJMag+UKL6L3Y8uYg9/HurqJjJVnZcCJZ7T1t3D26fOvCIZ3KhW6AtRrnDrA==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "color-convert": "2.0.1", + "color-parse": "1.4.2", + "lodash-es": "4.17.21", + "vanilla-colorful": "0.7.2" + } + }, + "node_modules/@ckeditor/ckeditor5-ui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@ckeditor/ckeditor5-ui/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@ckeditor/ckeditor5-undo": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-undo/-/ckeditor5-undo-43.1.1.tgz", + "integrity": "sha512-qX8jy5d8H4emWNCmA4EN2ZE/UGfBN1AqhMYtdX73EIxnDwVzT6Hd+GUaScDQoKn7Y81vO5dELPKFddaQN077Ew==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-upload": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-upload/-/ckeditor5-upload-43.1.1.tgz", + "integrity": "sha512-VIylGThmbwCKazx2XZBS8WYW7AYOgZzS8zQ1WDwT80tfOC3cjykNvg59eH7OACDeWud1LD47/idTj0wVC8gsIg==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1" + } + }, + "node_modules/@ckeditor/ckeditor5-utils": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-43.1.1.tgz", + "integrity": "sha512-x7d1Iy2j6be74Nqv5MwWjBtVX8xv3lsbkUc0n/K26Edql5d2sk05MeA5kyBowHzqFEVDgDOUCj9Thl5KrJpb5w==", + "dependencies": { + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-watchdog": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-watchdog/-/ckeditor5-watchdog-43.1.1.tgz", + "integrity": "sha512-/IyxNGhYKzioxwzK+H5NbgzHPNOBHkNbUwnC3vM89OOLxu5g77edEn/kcSBsEABYweddUK8LrPrKKvTcYC+tuw==", + "dependencies": { + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-widget": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-widget/-/ckeditor5-widget-43.1.1.tgz", + "integrity": "sha512-3S6T7bImVAX2OHkrKeTRRWn+WE5nJyvrRPNItPTXhxgDPrbAYRpvH3mtcoUjb24cw1dDfHRwolBTXRv1DxqAUw==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-enter": "43.1.1", + "@ckeditor/ckeditor5-typing": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-word-count": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-word-count/-/ckeditor5-word-count-43.1.1.tgz", + "integrity": "sha512-eMLf6iC/yH2ZSJtnfU9W/92J/JYwGhrU8AGsrffGqPkJkHSe9qbSUHhpEyae+Q+GTK6FMU1pEC6tAdlxOWmRcw==", + "dependencies": { + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "ckeditor5": "43.1.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/vite-plugin-ckeditor5": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@ckeditor/vite-plugin-ckeditor5/-/vite-plugin-ckeditor5-0.1.3.tgz", + "integrity": "sha512-TmwzXipkz+QCXgyxTQUlml2aMIdFFnq0YdKxb7wu6pLlmpfIOsuB4QtiRaMPp7jhsvSqtyTuBeurjAxpVQAUYw==", + "deprecated": "The Vite plugin is deprecated, and new versions will not be released. CKEditor 5 version 42.0.0 works with Vite without any special setup. For more information, read the migration guide: https://ckeditor.com/docs/ckeditor5/latest/updating/nim-migration/customized-builds.html", + "hasInstallScript": true, + "dependencies": { + "postcss": "^8.4.12", + "postcss-import": "^14.1.0", + "postcss-mixins": "^9.0.2", + "postcss-nesting": "^10.1.4" + }, + "engines": { + "node": "^14.18.0 || >= 16" } }, "node_modules/@colors/colors": { @@ -2435,6 +3194,21 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@csstools/selector-specificity": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.10" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -3274,6 +4048,18 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/@isaul32/ckeditor5-math": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/@isaul32/ckeditor5-math/-/ckeditor5-math-43.1.1.tgz", + "integrity": "sha512-R5K4aT12WXc6/4z2SfYqKZsfx4mRKCSzwEEJsWHSv+fTQ7E+v9ByE1X1e614ejCr5WvjlvkEYMZstydIknYrvA==", + "dependencies": { + "ckeditor5": "43.1.1" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=5.7.1" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "dev": true, @@ -5646,6 +6432,11 @@ "react": ">=16" } }, + "node_modules/@mixmark-io/domino": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz", + "integrity": "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==" + }, "node_modules/@nabla/vite-plugin-eslint": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@nabla/vite-plugin-eslint/-/vite-plugin-eslint-2.0.2.tgz", @@ -5744,7 +6535,6 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -5756,7 +6546,6 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -5764,7 +6553,6 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -7098,14 +7886,6 @@ "node": ">=14.0.0" } }, - "node_modules/@renku/ckeditor5-build-renku": { - "version": "0.0.6", - "license": "GPL-2.0-or-later, Apache-2.0", - "engines": { - "node": ">=8.0.0", - "npm": ">=5.7.1" - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.21.3", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.3.tgz", @@ -17696,6 +18476,11 @@ "node": "0.4 || >=0.5.8" } }, + "node_modules/blurhash": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.5.tgz", + "integrity": "sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==" + }, "node_modules/body-parser": { "version": "1.20.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", @@ -17992,6 +18777,14 @@ "node": ">=6" } }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001660", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz", @@ -18181,6 +18974,70 @@ "dev": true, "license": "MIT" }, + "node_modules/ckeditor5": { + "version": "43.1.1", + "resolved": "https://registry.npmjs.org/ckeditor5/-/ckeditor5-43.1.1.tgz", + "integrity": "sha512-/nVXYI81XT1xzE1SKrmgF5qViHYqf3hC+BhizC8r1RZ82SB28G9gRmahYSt2pMkpI6w165OwXCdWEoIVAtiYRg==", + "dependencies": { + "@ckeditor/ckeditor5-adapter-ckfinder": "43.1.1", + "@ckeditor/ckeditor5-alignment": "43.1.1", + "@ckeditor/ckeditor5-autoformat": "43.1.1", + "@ckeditor/ckeditor5-autosave": "43.1.1", + "@ckeditor/ckeditor5-basic-styles": "43.1.1", + "@ckeditor/ckeditor5-block-quote": "43.1.1", + "@ckeditor/ckeditor5-ckbox": "43.1.1", + "@ckeditor/ckeditor5-ckfinder": "43.1.1", + "@ckeditor/ckeditor5-clipboard": "43.1.1", + "@ckeditor/ckeditor5-cloud-services": "43.1.1", + "@ckeditor/ckeditor5-code-block": "43.1.1", + "@ckeditor/ckeditor5-core": "43.1.1", + "@ckeditor/ckeditor5-easy-image": "43.1.1", + "@ckeditor/ckeditor5-editor-balloon": "43.1.1", + "@ckeditor/ckeditor5-editor-classic": "43.1.1", + "@ckeditor/ckeditor5-editor-decoupled": "43.1.1", + "@ckeditor/ckeditor5-editor-inline": "43.1.1", + "@ckeditor/ckeditor5-editor-multi-root": "43.1.1", + "@ckeditor/ckeditor5-engine": "43.1.1", + "@ckeditor/ckeditor5-enter": "43.1.1", + "@ckeditor/ckeditor5-essentials": "43.1.1", + "@ckeditor/ckeditor5-find-and-replace": "43.1.1", + "@ckeditor/ckeditor5-font": "43.1.1", + "@ckeditor/ckeditor5-heading": "43.1.1", + "@ckeditor/ckeditor5-highlight": "43.1.1", + "@ckeditor/ckeditor5-horizontal-line": "43.1.1", + "@ckeditor/ckeditor5-html-embed": "43.1.1", + "@ckeditor/ckeditor5-html-support": "43.1.1", + "@ckeditor/ckeditor5-image": "43.1.1", + "@ckeditor/ckeditor5-indent": "43.1.1", + "@ckeditor/ckeditor5-language": "43.1.1", + "@ckeditor/ckeditor5-link": "43.1.1", + "@ckeditor/ckeditor5-list": "43.1.1", + "@ckeditor/ckeditor5-markdown-gfm": "43.1.1", + "@ckeditor/ckeditor5-media-embed": "43.1.1", + "@ckeditor/ckeditor5-mention": "43.1.1", + "@ckeditor/ckeditor5-minimap": "43.1.1", + "@ckeditor/ckeditor5-page-break": "43.1.1", + "@ckeditor/ckeditor5-paragraph": "43.1.1", + "@ckeditor/ckeditor5-paste-from-office": "43.1.1", + "@ckeditor/ckeditor5-remove-format": "43.1.1", + "@ckeditor/ckeditor5-restricted-editing": "43.1.1", + "@ckeditor/ckeditor5-select-all": "43.1.1", + "@ckeditor/ckeditor5-show-blocks": "43.1.1", + "@ckeditor/ckeditor5-source-editing": "43.1.1", + "@ckeditor/ckeditor5-special-characters": "43.1.1", + "@ckeditor/ckeditor5-style": "43.1.1", + "@ckeditor/ckeditor5-table": "43.1.1", + "@ckeditor/ckeditor5-theme-lark": "43.1.1", + "@ckeditor/ckeditor5-typing": "43.1.1", + "@ckeditor/ckeditor5-ui": "43.1.1", + "@ckeditor/ckeditor5-undo": "43.1.1", + "@ckeditor/ckeditor5-upload": "43.1.1", + "@ckeditor/ckeditor5-utils": "43.1.1", + "@ckeditor/ckeditor5-watchdog": "43.1.1", + "@ckeditor/ckeditor5-widget": "43.1.1", + "@ckeditor/ckeditor5-word-count": "43.1.1" + } + }, "node_modules/classnames": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", @@ -18364,6 +19221,14 @@ "version": "1.1.3", "license": "MIT" }, + "node_modules/color-parse": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.2.tgz", + "integrity": "sha512-RI7s49/8yqDj3fECFZjUI1Yi0z/Gq1py43oNJivAIIDSyJiOZLfYCRQEgn8HEVAj++PcRe8AnL2XF0fRJ3BTnA==", + "dependencies": { + "color-name": "^1.0.0" + } + }, "node_modules/color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", @@ -19798,6 +20663,17 @@ "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", "dev": true }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/cssom": { "version": "0.4.4", "dev": true, @@ -22711,7 +23587,6 @@ }, "node_modules/fast-glob": { "version": "3.2.12", - "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -22740,7 +23615,6 @@ }, "node_modules/fastq": { "version": "1.13.0", - "dev": true, "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -30196,6 +31070,17 @@ "react": ">= 0.14.0" } }, + "node_modules/marked": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.12.tgz", + "integrity": "sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, "node_modules/mathjax-full": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.2.2.tgz", @@ -30618,7 +31503,6 @@ }, "node_modules/merge2": { "version": "1.4.1", - "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -31262,7 +32146,6 @@ }, "node_modules/micromatch": { "version": "4.0.5", - "dev": true, "license": "MIT", "dependencies": { "braces": "^3.0.2", @@ -31470,7 +32353,6 @@ "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, "funding": [ { "type": "github", @@ -33146,7 +34028,6 @@ "version": "8.4.47", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -33170,6 +34051,112 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-mixins": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/postcss-mixins/-/postcss-mixins-9.0.4.tgz", + "integrity": "sha512-XVq5jwQJDRu5M1XGkdpgASqLk37OqkH4JCFDXl/Dn7janOJjCTEKL+36cnRVy7bMtoBzALfO7bV7nTIsFnUWLA==", + "dependencies": { + "fast-glob": "^3.2.11", + "postcss-js": "^4.0.0", + "postcss-simple-vars": "^7.0.0", + "sugarss": "^4.0.1" + }, + "engines": { + "node": ">=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nesting": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", + "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-simple-vars": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-simple-vars/-/postcss-simple-vars-7.0.1.tgz", + "integrity": "sha512-5GLLXaS8qmzHMOjVxqkk1TZPf1jMqesiI7qLhnlyERalG0sMbHIbJqrcnrpmZdKCLglHnRHoEBB61RtGTsj++A==", + "engines": { + "node": ">=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.1" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, "node_modules/prelude-ls": { "version": "1.1.2", "engines": { @@ -33681,7 +34668,6 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", - "dev": true, "funding": [ { "type": "github", @@ -34526,6 +35512,22 @@ "react-dom": ">=16.8.0" } }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/read-pkg-up": { "version": "7.0.1", "dev": true, @@ -35457,7 +36459,6 @@ }, "node_modules/reusify": { "version": "1.0.4", - "dev": true, "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -35680,7 +36681,6 @@ }, "node_modules/run-parallel": { "version": "1.2.0", - "dev": true, "funding": [ { "type": "github", @@ -36762,6 +37762,21 @@ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, + "node_modules/sugarss": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-4.0.1.tgz", + "integrity": "sha512-WCjS5NfuVJjkQzK10s8WOBY+hhDxxNt/N6ZaGwxFZ+wN3/lKKFSaaKUNecULcTTvE4urLcKaZFQD8vO0mOZujw==", + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, "node_modules/supports-color": { "version": "5.5.0", "license": "MIT", @@ -37458,6 +38473,19 @@ "dev": true, "license": "0BSD" }, + "node_modules/turndown": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.2.0.tgz", + "integrity": "sha512-eCZGBN4nNNqM9Owkv9HAtWRYfLA4h909E/WGAWWBpmB275ehNhZyk87/Tpvjbp0jjNl9XwCsbe6bm6CqFsgD+A==", + "dependencies": { + "@mixmark-io/domino": "^2.2.0" + } + }, + "node_modules/turndown-plugin-gfm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/turndown-plugin-gfm/-/turndown-plugin-gfm-1.0.2.tgz", + "integrity": "sha512-vwz9tfvF7XN/jE0dGoBei3FXWuvll78ohzCZQuOb+ZjWrs3a0XhQVomJEb2Qh4VHTPNRO4GPZh0V7VRbiWwkRg==" + }, "node_modules/type-check": { "version": "0.3.2", "license": "MIT", @@ -38156,6 +39184,11 @@ "version": "1.0.1", "license": "MIT" }, + "node_modules/vanilla-colorful": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/vanilla-colorful/-/vanilla-colorful-0.7.2.tgz", + "integrity": "sha512-z2YZusTFC6KnLERx1cgoIRX2CjPRP0W75N+3CC6gbvdX5Ch47rZkEMGO2Xnf+IEmi3RiFLxS18gayMA27iU7Kg==" + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/client/package.json b/client/package.json index 19bf533246..5c816efae6 100644 --- a/client/package.json +++ b/client/package.json @@ -33,15 +33,20 @@ }, "type": "module", "dependencies": { - "@ckeditor/ckeditor5-react": "^5.1.0", + "ckeditor5": "43.1.1", + "@ckeditor/ckeditor5-build-classic": "43.1.1", + "@ckeditor/ckeditor5-list": "43.1.1", + "@ckeditor/ckeditor5-react": "^9.3.0", + "@ckeditor/ckeditor5-word-count": "43.1.1", + "@ckeditor/vite-plugin-ckeditor5": "^0.1.3", "@fortawesome/fontawesome-svg-core": "^1.2.35", "@fortawesome/free-brands-svg-icons": "^5.15.3", "@fortawesome/free-regular-svg-icons": "^5.15.3", "@fortawesome/free-solid-svg-icons": "^5.15.3", "@fortawesome/react-fontawesome": "^0.2.0", + "@isaul32/ckeditor5-math": "43.1.1", "@popperjs/core": "^2.11.8", "@reduxjs/toolkit": "^1.9.7", - "@renku/ckeditor5-build-renku": "0.0.6", "@sentry/react": "^7.119.1", "ajv": "^6.12.6", "bootstrap": "^5.3.3", diff --git a/client/src/components/buttons/Button.tsx b/client/src/components/buttons/Button.tsx index 7818b7b2dc..4efa794c8e 100644 --- a/client/src/components/buttons/Button.tsx +++ b/client/src/components/buttons/Button.tsx @@ -26,7 +26,7 @@ import { IconProp } from "@fortawesome/fontawesome-svg-core"; import { faSyncAlt } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import cx from "classnames"; -import { Fragment, ReactNode, useRef, useState } from "react"; +import React, { Fragment, ReactNode, useEffect, useRef, useState } from "react"; import { ArrowRight, ChevronDown, @@ -42,6 +42,7 @@ import { Col, DropdownMenu, DropdownToggle, + Tooltip, UncontrolledDropdown, UncontrolledTooltip, } from "reactstrap"; @@ -444,6 +445,100 @@ function EditButtonLink({ ); } +interface EditSaveButtonProps { + "data-cy"?: string; + disabled?: boolean; + toggle: () => void; + tooltipMessage?: string | null; + checksBeforeSave?: () => boolean; + checksBeforeSaveTooltipMessage?: () => string | null; +} +function EditSaveButton({ + "data-cy": dataCy, + disabled, + toggle, + tooltipMessage = null, + checksBeforeSave = () => false, + checksBeforeSaveTooltipMessage = () => null, +}: EditSaveButtonProps) { + const [localDisabled, setLocalDisabled] = useState(disabled); + const ref = useRef(null); + const saveButtonRef = useRef(null); + const [editMode, setEditMode] = useState(false); + const [checksBeforeSaveTooltip, setChecksBeforeSaveTooltip] = useState(false); + + useEffect(() => { + setLocalDisabled(disabled); + }, [disabled]); + + return ( + <> + + {!editMode && localDisabled ? ( + + ) : editMode ? ( + + + {checksBeforeSaveTooltip && localDisabled ? ( + + {checksBeforeSaveTooltipMessage()} + + ) : tooltipMessage ? ( + + {tooltipMessage} + + ) : ( + <> + )} + + + ) : ( + + )} + + + ); +} + export function PlusRoundButton({ "data-cy": dataCy, handler, @@ -478,6 +573,7 @@ export { ButtonWithMenu, CardButton, EditButtonLink, + EditSaveButton, GoBackButton, InlineSubmitButton, RefreshButton, diff --git a/client/src/components/form-field/CkEditor.jsx b/client/src/components/form-field/CkEditor.jsx index 7db0958fda..c312cadf80 100644 --- a/client/src/components/form-field/CkEditor.jsx +++ b/client/src/components/form-field/CkEditor.jsx @@ -19,38 +19,277 @@ // Until we upgrade to CKEditor 5 v6.0.0, it is necessary to // wrap the CKEditor component in a JS (not TS) component +import { ClassicEditor as ClassicEditorBase } from "@ckeditor/ckeditor5-editor-classic"; +import { Essentials } from "@ckeditor/ckeditor5-essentials"; +import { Autoformat } from "@ckeditor/ckeditor5-autoformat"; +import { Markdown } from "@ckeditor/ckeditor5-markdown-gfm"; +import { + Bold, + Italic, + Underline, + Strikethrough, + Code, + // Subscript, + // Superscript, +} from "@ckeditor/ckeditor5-basic-styles"; +import { BlockQuote } from "@ckeditor/ckeditor5-block-quote"; +import { CodeBlock } from "@ckeditor/ckeditor5-code-block"; +import Math from "@isaul32/ckeditor5-math/src/math"; +import AutoformatMath from "@isaul32/ckeditor5-math/src/autoformatmath"; +import { Heading } from "@ckeditor/ckeditor5-heading"; +import { SourceEditing } from "@ckeditor/ckeditor5-source-editing"; +import { WordCount } from "@ckeditor/ckeditor5-word-count"; +import { List, TodoList } from "@ckeditor/ckeditor5-list"; +// import { Alignment } from "@ckeditor/ckeditor5-alignment"; +import { Link, LinkImage } from "@ckeditor/ckeditor5-link"; +import { + ImageBlockEditing, + // ImageInsert, + ImageInsertViaUrl, + // ImageResize, + // ImageToolbar, + // ImageUpload, +} from "@ckeditor/ckeditor5-image"; +// import { Base64UploadAdapter } from "@ckeditor/ckeditor5-upload"; +import { + Table, + TableCaption, + TableCellProperties, + TableColumnResize, + TableProperties, + TableToolbar, +} from "@ckeditor/ckeditor5-table"; +import { HorizontalLine } from "@ckeditor/ckeditor5-horizontal-line"; + import { CKEditor } from "@ckeditor/ckeditor5-react"; -import RenkuCKEditor from "@renku/ckeditor5-build-renku"; + +import "ckeditor5/ckeditor5.css"; +import "./ckEditor.css"; + +import katex from "katex"; +import "katex/dist/katex.min.css"; + +window.katex = katex; + +class RenkuWordCount extends WordCount { + constructor(editor) { + super(editor); + this.isSourceEditingMode = false; + const sourceEditing = editor.plugins.get("SourceEditing"); + sourceEditing.on( + "change:isSourceEditingMode", + (_eventInfo, _name, value) => { + if (value) { + this.isSourceEditingMode = true; + // Source editing textarea is not yet available. + setTimeout(() => { + const sourceEditingTextarea = + editor.editing.view.getDomRoot().nextSibling.firstChild; + if (sourceEditingTextarea) { + sourceEditingTextarea.addEventListener("input", (event) => { + sourceEditing.updateEditorData(); + this.fire("update", { + exact: true, + words: this.words, + characters: () => event.target.value.length, + }); + }); + this.fire("update", { + exact: true, + words: this.words, + characters: () => sourceEditingTextarea.value.length, + }); + } + }); + } else { + this.isSourceEditingMode = false; + this._refreshStats(); + } + } + ); + } + + _refreshStats() { + if (!this.isSourceEditingMode) { + const words = this.words; + const characters = this.characters; + this.fire("update", { + exact: false, + words, + characters, + }); + } + } +} + +class ClassicEditor extends ClassicEditorBase {} + +ClassicEditor.builtinPlugins = [ + Essentials, + Markdown, + Autoformat, + SourceEditing, + Heading, + Bold, + Italic, + Underline, + Strikethrough, + BlockQuote, + BlockQuote, + Code, + CodeBlock, + List, + TodoList, + // Alignment, + // Superscript, + // Subscript, + Link, + LinkImage, + ImageInsertViaUrl, + ImageBlockEditing, + HorizontalLine, + Table, + TableCaption, + TableCellProperties, + TableColumnResize, + TableProperties, + TableToolbar, + // ImageBlock, + // ImageInsert, + // ImageResize, + // ImageToolbar, + // ImageUpload, + // Base64UploadAdapter, + Math, + AutoformatMath, + RenkuWordCount, +]; function CkEditor({ - data, - disabled, id, - invalid, name, - outputType, - setInputs, + data, + disabled = false, + invalid = false, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + setInputs = (value) => {}, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + wordCount = (stats) => {}, }) { + const editorConfig = { + toolbar: { + items: [ + "undo", + "redo", + "|", + "heading", + "|", + "bold", + "italic", + "underline", + "strikethrough", + "blockQuote", + "|", + "code", + "codeBlock", + "|", + { + label: "List", + withText: true, + items: ["bulletedList", "numberedList", "todoList"], + }, + "|", + // "alignment", + // "|", + // "superscript", + // "subscript", + "math", + "|", + "link", + "insertImage", + "|", + "horizontalLine", + "insertTable", + "|", + /*{ + label: "Other", + withText: false, + items: [ + "insertImage", + "resizeImage", + ], + },*/ + "sourceEditing", + ], + }, + math: { + engine: "katex", + enablePreview: true, + }, + wordCount: { + onUpdate: wordCount, + }, + }; return ( { - const artificialEvent = { - target: { name: name, value: editor.getData() }, - isPersistent: () => false, + onReady={(e) => { + if (disabled) { + e.ui.view.toolbar.element.style.display = "none"; + } + + e.data.processor._html2markdown._parser.keep("u"); + e.data.processor._html2markdown._parser.addRule("math", { + filter: ["script"], + replacement: function (content) { + return "$" + content.replace(/(?:\\(.))/g, "$1") + "$"; + }, + }); + const latex = { + name: "latex", + level: "inline", + start(src) { + return src.match(/\$/)?.index; + }, + tokenizer(src) { + // Inspired by https://github.com/markedjs/marked/blob/4c5b974b391f913ac923610bd3740ef27ccdae95/src/Tokenizer.js#L647 + const cap = /^(\$+)([^$]|[^$][\s\S]*?[^$])\1(?!\$)/.exec(src); + if (cap) { + let formula = cap[2].replace(/\n/g, " "); + const hasNonSpaceChars = /[^ ]/.test(formula); + const hasSpaceCharsOnBothEnds = + /^ /.test(formula) && / $/.test(formula); + if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) { + formula = formula.substring(1, formula.length - 1); + } + return { + type: "latex", + raw: cap[0], + text: formula, + }; + } + }, + renderer({ text }) { + return ``; + }, }; - setInputs(artificialEvent); + e.data.processor._markdown2html._parser.use({ extensions: [latex] }); + e.setData(data); + + e.model.document.on("change:data", () => { + const artificialEvent = { + target: { name: name, value: e.getData() }, + isPersistent: () => false, + }; + setInputs(artificialEvent); + }); }} /> ); diff --git a/client/src/components/form-field/LazyCkEditorRenderer.tsx b/client/src/components/form-field/LazyCkEditorRenderer.tsx new file mode 100644 index 0000000000..72b93479eb --- /dev/null +++ b/client/src/components/form-field/LazyCkEditorRenderer.tsx @@ -0,0 +1,35 @@ +/*! + * Copyright 2023 - Swiss Data Science Center (SDSC) + * A partnership between École Polytechnique Fédérale de Lausanne (EPFL) and + * Eidgenössische Technische Hochschule Zürich (ETHZ). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { lazy, Suspense } from "react"; +import { Loader } from "../Loader"; + +const CkEditor = lazy(() => import("./CkEditor")); + +export function LazyCkEditorRenderer(props: { name: string; data: string }) { + return ( + }> + + + ); +} diff --git a/client/src/components/form-field/TextAreaInput.tsx b/client/src/components/form-field/TextAreaInput.tsx index d53d34244b..5ab9af7a70 100644 --- a/client/src/components/form-field/TextAreaInput.tsx +++ b/client/src/components/form-field/TextAreaInput.tsx @@ -17,87 +17,36 @@ */ // TODO: Upgrade to ckeditor5 v6.0.0 to get TS support +import cx from "classnames"; import React from "react"; -import { Controller } from "react-hook-form"; import type { Control, FieldError, FieldValues, - Path, UseFormRegisterReturn, } from "react-hook-form"; -import { Input, FormGroup, FormText, Label } from "reactstrap"; +import { FormGroup, FormText } from "reactstrap"; import FormLabel from "./FormLabel"; import { ErrorLabel } from "../formlabels/FormLabels"; import LazyCkEditor from "./LazyCkEditor"; -type EditMarkdownSwitchProps = { - codeView: boolean; - setCodeView: React.Dispatch>; -}; - -function EditMarkdownSwitch(props: EditMarkdownSwitchProps) { - const outputType = "markdown"; - const switchLabel = outputType === "markdown" ? "Raw Markdown" : "Raw HTML"; - return ( -
- { - props.setCodeView(!props.codeView); - }} - /> - -
- ); -} - -type MarkdownInputProps = TextAreaInputProps & - Omit; - -function MarkdownInput(props: MarkdownInputProps) { - const setInputs = (value: { target: { name: string; value: unknown } }) => { - props.register.onChange(value); +function MarkdownInput(props: TextAreaInputProps) { + const setInputs = async (value: { + target: { name: string; value: unknown }; + }) => { + await props.register.onChange(value); }; - const outputType = "markdown"; - const value = props.getValue(); - if (props.codeView) { - // User wants to input markdown directly - return ( - } - render={({ field }) => ( - - )} - /> - ); - } - // User wants to rich-text input return ( ); } @@ -107,28 +56,42 @@ interface TextAreaInputProps { error?: FieldError; getValue: () => string; help?: string | React.ReactNode; - label: string; + label?: string; name: string; register: UseFormRegisterReturn; required?: boolean; + wordCount?: (stats: { + exact: boolean; + characters: number; + words: number; + }) => void; } function TextAreaInput(props: TextAreaInputProps) { - const [codeView, setCodeView] = React.useState(false); - return (
- - + {props.label ? ( + + ) : ( +
+ )}
-
- +
+
{props.help && {props.help}} {props.error && ( diff --git a/client/src/components/form-field/ckEditor.css b/client/src/components/form-field/ckEditor.css new file mode 100644 index 0000000000..2af6ea90ef --- /dev/null +++ b/client/src/components/form-field/ckEditor.css @@ -0,0 +1,8 @@ +.ck.ck-editor__main > .ck-editor__editable:not(.ck-focused) { + border: 0px; +} +.ck.ck-editor__top + .ck-sticky-panel:not(.ck-focused) + .ck-sticky-panel__content:not(.ck-focused) { + border: 0px; +} diff --git a/client/src/components/formlabels/FormLabels.tsx b/client/src/components/formlabels/FormLabels.tsx index 592cad3642..ada77d03a5 100644 --- a/client/src/components/formlabels/FormLabels.tsx +++ b/client/src/components/formlabels/FormLabels.tsx @@ -57,10 +57,12 @@ interface InputLabelProps extends LabelProps { } const InputLabel = ({ text, isRequired = false }: InputLabelProps) => { - return ( + return text ? ( + ) : ( + <> ); }; diff --git a/client/src/features/ProjectPageV2/ProjectPageContainer/ProjectPageContainer.tsx b/client/src/features/ProjectPageV2/ProjectPageContainer/ProjectPageContainer.tsx index dbd6d1d144..e652c528f7 100644 --- a/client/src/features/ProjectPageV2/ProjectPageContainer/ProjectPageContainer.tsx +++ b/client/src/features/ProjectPageV2/ProjectPageContainer/ProjectPageContainer.tsx @@ -44,6 +44,7 @@ export default function ProjectPageContainer() { useGetNamespacesByNamespaceProjectsAndSlugQuery({ namespace: namespace ?? "", slug: slug ?? "", + withDocumentation: true, }); const navigate = useNavigate(); diff --git a/client/src/features/ProjectPageV2/ProjectPageContent/Documentation/Documentation.tsx b/client/src/features/ProjectPageV2/ProjectPageContent/Documentation/Documentation.tsx new file mode 100644 index 0000000000..45c7cfbe2b --- /dev/null +++ b/client/src/features/ProjectPageV2/ProjectPageContent/Documentation/Documentation.tsx @@ -0,0 +1,157 @@ +/*! + * Copyright 2024 - Swiss Data Science Center (SDSC) + * A partnership between École Polytechnique Fédérale de Lausanne (EPFL) and + * Eidgenössische Technische Hochschule Zürich (ETHZ). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import cx from "classnames"; +import { useCallback, useState } from "react"; + +import { FileEarmarkText } from "react-bootstrap-icons"; +import { Card, CardBody, CardHeader, ListGroup } from "reactstrap"; + +import { EditSaveButton } from "../../../../components/buttons/Button"; + +import { Project } from "../../../projectsV2/api/projectV2.api"; +import { usePatchProjectsByProjectIdMutation } from "../../../projectsV2/api/projectV2.enhanced-api"; +import TextAreaInput from "../../../../components/form-field/TextAreaInput.tsx"; +import { useForm } from "react-hook-form"; +import { LazyCkEditorRenderer } from "../../../../components/form-field/LazyCkEditorRenderer.tsx"; + +interface DocumentationForm { + description: string; +} + +export default function Documentation({ project }: { project: Project }) { + const [updateProject] = usePatchProjectsByProjectIdMutation(); + const [description, setDescription] = useState(project.documentation || ""); + + const { control, handleSubmit, setValue, getValues, register } = + useForm(); + const onSubmit = useCallback( + (data: DocumentationForm) => { + setDescription(data.description); + setShowEditor(false); + updateProject({ + "If-Match": project.etag ? project.etag : "", + projectId: project.id, + projectPatch: { documentation: data.description }, + }); + }, + [project.etag, project.id, updateProject] + ); + + const [showEditor, setShowEditor] = useState(false); + const toggle = () => { + setShowEditor(!showEditor); + setValue("description", description); + }; + + const markdownCharacterLimit = 5000; + const aboutCharacterLimit = + Math.floor(((2 / 3) * markdownCharacterLimit) / 10) * 10; + const [characterLimit, setCharacterLimit] = useState(aboutCharacterLimit); + const [character, setCharacter] = useState(0); + const [disabledSaveButton, setDisabledSaveButton] = useState(false); + + const wordCount = (stats: { + exact: boolean; + characters: number; + words: number; + }) => { + stats.exact + ? setCharacterLimit(markdownCharacterLimit) + : setCharacterLimit(aboutCharacterLimit); + setCharacter(stats.characters); + }; + + const descriptionField = register("description"); + { + const descriptionFieldTmp = descriptionField.onChange; + descriptionField.onChange = (value) => { + setDisabledSaveButton(false); + return descriptionFieldTmp(value); + }; + } + + return ( + +
+ +
+

+ + Documentation +

+ + {showEditor ? ( + + {character} of + {characterLimit == aboutCharacterLimit ? " about " : " "} + {characterLimit} characters   + + ) : ( + <> + )} + { + if ( + getValues("description").length <= markdownCharacterLimit + ) { + return true; + } + setDisabledSaveButton(true); + return false; + }} + checksBeforeSaveTooltipMessage={() => + `Documentation is too long.\n The document can not be longer\nthan ${markdownCharacterLimit} characters.` + } + /> + +
+
+ + {showEditor ? ( + + + control={control} + getValue={() => getValues("description")} + name="description" + register={descriptionField} + wordCount={wordCount} + /> + + ) : ( + +
+ +
+ )} +
+
+
+ ); +} diff --git a/client/src/features/ProjectPageV2/ProjectPageContent/ProjectOverviewPage.tsx b/client/src/features/ProjectPageV2/ProjectPageContent/ProjectOverviewPage.tsx index bdcb693f48..edbed9494b 100644 --- a/client/src/features/ProjectPageV2/ProjectPageContent/ProjectOverviewPage.tsx +++ b/client/src/features/ProjectPageV2/ProjectPageContent/ProjectOverviewPage.tsx @@ -22,6 +22,7 @@ import SessionsV2 from "../../sessionsV2/SessionsV2"; import { useProject } from "../ProjectPageContainer/ProjectPageContainer"; import { CodeRepositoriesDisplay } from "./CodeRepositories/RepositoriesBox"; import ProjectDataConnectorsBox from "./DataConnectors/ProjectDataConnectorsBox"; +import Documentation from "./Documentation/Documentation"; import ProjectInformation from "./ProjectInformation/ProjectInformation"; export default function ProjectOverviewPage() { @@ -40,6 +41,9 @@ export default function ProjectOverviewPage() { + + + diff --git a/client/vite.config.ts b/client/vite.config.ts index 898e99d7fc..637bd7fc66 100644 --- a/client/vite.config.ts +++ b/client/vite.config.ts @@ -1,7 +1,11 @@ import eslintPlugin from "@nabla/vite-plugin-eslint"; import react from "@vitejs/plugin-react"; +import ckeditor5 from "@ckeditor/vite-plugin-ckeditor5"; import { resolve } from "path"; import { defineConfig } from "vite"; +import { createRequire } from "node:module"; + +const require = createRequire(import.meta.url); // https://vitejs.dev/config/ export default defineConfig({ @@ -9,7 +13,11 @@ export default defineConfig({ outDir: "build", sourcemap: true, }, - plugins: [react({ include: "/index.html" }), eslintPlugin()], + plugins: [ + react({ include: "/index.html" }), + ckeditor5({ theme: require.resolve("@ckeditor/ckeditor5-theme-lark") }), + eslintPlugin(), + ], resolve: { alias: { "~bootstrap": resolve(__dirname, "node_modules/bootstrap"), diff --git a/tests/.eslintrc.json b/tests/.eslintrc.json index d2bfc2a17c..ef7f3d9a65 100644 --- a/tests/.eslintrc.json +++ b/tests/.eslintrc.json @@ -17,7 +17,7 @@ } ], "no-console": "warn", - "max-nested-callbacks": ["warn", 3], + "max-nested-callbacks": ["warn", 4], "no-alert": "error", "no-else-return": "warn", "jest/expect-expect": "off", diff --git a/tests/cypress/e2e/projectDatasets.spec.ts b/tests/cypress/e2e/projectDatasets.spec.ts index c699e3c72a..0b0f2961fb 100644 --- a/tests/cypress/e2e/projectDatasets.spec.ts +++ b/tests/cypress/e2e/projectDatasets.spec.ts @@ -153,9 +153,11 @@ describe("Project dataset", () => { cy.get("div.ck-editor__main").contains("Dataset for testing purposes"); cy.getDataCy("ckeditor-description") - .find("p") + .find(".ck-content[contenteditable=true]") .click() - .type(". New description"); + .then((element) => + element[0].ckeditorInstance.setData(". New description") + ); cy.get("div.tree-container").contains("air_quality_no2.txt"); cy.get('[data-cy="dropzone"]').attachFile( diff --git a/tests/cypress/e2e/projectV2setup.spec.ts b/tests/cypress/e2e/projectV2setup.spec.ts index ec8bd6abf1..0f699ec1d9 100644 --- a/tests/cypress/e2e/projectV2setup.spec.ts +++ b/tests/cypress/e2e/projectV2setup.spec.ts @@ -39,7 +39,9 @@ describe("Set up project components", () => { it("set up repositories", () => { fixtures - .readProjectV2({ fixture: "projectV2/read-projectV2-empty.json" }) + .readProjectV2({ + fixture: "projectV2/read-projectV2-empty.json", + }) .listProjectDataConnectors() .getDataConnector() .updateProjectV2({ @@ -63,7 +65,7 @@ describe("Set up project components", () => { cy.wait("@getProjectAfterUpdate"); // edit code repository - cy.getDataCy("code-repository-edit").click(); + cy.getDataCy("code-repository-edit").first().click(); cy.getDataCy("project-edit-repository-url").type("2"); cy.getDataCy("edit-code-repository-modal-button").click(); cy.wait("@updateProjectV2"); @@ -186,7 +188,9 @@ describe("Set up data connectors", () => { it("create a simple data connector", () => { fixtures - .readProjectV2({ fixture: "projectV2/read-projectV2-empty.json" }) + .readProjectV2({ + fixture: "projectV2/read-projectV2-empty.json", + }) .listProjectDataConnectors() .getDataConnector() .getStorageSchema({ fixture: "cloudStorage/storage-schema-s3.json" }) @@ -251,7 +255,9 @@ describe("Set up data connectors", () => { it("link a data connector", () => { fixtures - .readProjectV2({ fixture: "projectV2/read-projectV2-empty.json" }) + .readProjectV2({ + fixture: "projectV2/read-projectV2-empty.json", + }) .listProjectDataConnectors() .getDataConnectorByNamespaceAndSlug() .postDataConnectorProjectLink({ dataConnectorId: "ULID-1" }); @@ -270,7 +276,9 @@ describe("Set up data connectors", () => { it("link a data connector not found", () => { fixtures - .readProjectV2({ fixture: "projectV2/read-projectV2-empty.json" }) + .readProjectV2({ + fixture: "projectV2/read-projectV2-empty.json", + }) .listProjectDataConnectors() .getDataConnectorByNamespaceAndSlugNotFound(); cy.visit("/v2/projects/user1-uuid/test-2-v2-project"); @@ -290,7 +298,9 @@ describe("Set up data connectors", () => { it("unlink a data connector", () => { fixtures - .readProjectV2({ fixture: "projectV2/read-projectV2-empty.json" }) + .readProjectV2({ + fixture: "projectV2/read-projectV2-empty.json", + }) .listProjectDataConnectors() .getDataConnector() .deleteDataConnectorProjectLink(); @@ -319,7 +329,6 @@ describe("Set up data connectors", () => { it("unlink data connector not allowed", () => { fixtures - .readProjectV2({ fixture: "projectV2/read-projectV2-empty.json" }) .listProjectDataConnectors() .getDataConnector() .getProjectV2Permissions({ @@ -327,7 +336,6 @@ describe("Set up data connectors", () => { }) .deleteDataConnectorProjectLinkNotAllowed(); cy.visit("/v2/projects/user1-uuid/test-2-v2-project"); - cy.wait("@readProjectV2"); cy.wait("@listProjectDataConnectors"); cy.contains("example storage").should("be.visible").click(); @@ -416,6 +424,7 @@ describe("Set up data connectors", () => { .getDataConnectorPermissions() .patchDataConnector({ namespace: "user1-uuid" }) .patchDataConnectorSecrets({ + content: [], shouldNotBeCalled: true, }); diff --git a/tests/cypress/fixtures/projectV2/read-projectV2-without-documentation.json b/tests/cypress/fixtures/projectV2/read-projectV2-without-documentation.json new file mode 100644 index 0000000000..01fdc4de64 --- /dev/null +++ b/tests/cypress/fixtures/projectV2/read-projectV2-without-documentation.json @@ -0,0 +1,14 @@ +{ + "id": "THEPROJECTULID26CHARACTERS", + "name": "test 2 v2-project", + "slug": "test-2-v2-project", + "namespace": "user1-uuid", + "creation_date": "2023-11-15T09:55:59Z", + "created_by": "user1-uuid", + "repositories": [ + "https://domain.name/repo1.git", + "https://domain.name/repo2.git" + ], + "visibility": "public", + "description": "Project 2 description" +} diff --git a/tests/cypress/fixtures/projectV2/read-projectV2.json b/tests/cypress/fixtures/projectV2/read-projectV2.json index 03d34935da..da029ce1a7 100644 --- a/tests/cypress/fixtures/projectV2/read-projectV2.json +++ b/tests/cypress/fixtures/projectV2/read-projectV2.json @@ -11,5 +11,6 @@ ], "visibility": "public", "description": "Project 2 description", + "documentation": "$\\sqrt(2)$", "secrets_mount_directory": "/secrets" } diff --git a/tests/cypress/support/commands/datasets.ts b/tests/cypress/support/commands/datasets.ts index 8aceb47c8d..e1455320b8 100644 --- a/tests/cypress/support/commands/datasets.ts +++ b/tests/cypress/support/commands/datasets.ts @@ -69,10 +69,12 @@ function newDataset(newDataset: Dataset) { } if (newDataset.description) - cy.get("[data-cy='ckeditor-description']") - .find("p") + cy.getDataCy("ckeditor-description") + .find(".ck-content[contenteditable=true]") .click() - .type(newDataset.description); + .then((element) => + element[0].ckeditorInstance.setData(newDataset.description) + ); if (newDataset.file) { cy.get('[data-cy="dropzone"]').attachFile(