Giter VIP home page Giter VIP logo

ckeditor5-collaboration-samples's Introduction

A collection of collaboration features samples for CKEditor 5

This repository contains code samples and example integrations of CKEditor 5 collaboration features for "vanilla JS" applications and JavaScript frameworks.

Contents

Vanilla JS samples

Framework integration samples

Development

Refer to DEV-README.md file for development related documentation.

License

For license details see: LICENSE.md.

ckeditor5-collaboration-samples's People

Contributors

f1ames avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ckeditor5-collaboration-samples's Issues

Replace Uglify with Terser

When building with  --mode production  you get UglifyJs Unexpected token: keyword (const) because Uglify doesn't support ES6 modules. We had this issue in CKEditor 5 thus we have switched our builds to Terser

We should probably do the same for collaboration samples.  For example, below lines:
https://github.com/ckeditor/ckeditor5-collaboration-samples/blob/master/track-changes-for-angular/vendor/ckeditor5/webpack.config.js#L33-L46
https://github.com/ckeditor/ckeditor5-collaboration-samples/blob/master/track-changes-for-angular/vendor/ckeditor5/package.json#L39

should be replaced with:

webpack.config.js

const TerserPlugin = require( 'terser-webpack-plugin' );
...
optimization: {
  minimizer: [
      new TerserPlugin( {
    sourceMap: true,
    terserOptions: {
        output: {
      // Preserve CKEditor 5 license comments.
      comments: /^!/
        }
    },
    extractComments: false
      } )
  ]
 },

package.json

"terser-webpack-plugin": "^2.2.1",

Link to Uglify - mishoo/UglifyJS#3156 (comment). It seems no longer maintained.

Import from Word

Hi, I am new to CKEditor 5, I tried out the collaboration-track changes html samples. I want to add the Import from Word feature and track changes in a html sample to show my users. Are there any samples or detail steps to make this happen? Thanks!

Setup example for nextjs

Can we have a working example that uses NextJS and with recent React syntax? e.g. Without using class-based components if possible.

How to get the data of Ckeditor-5

I want to retrieve data from the CKEditor-5 to save it to my local database, so how to fetch the data from it. And also there is an inbuilt functionality that helps me to apply to debounce time to store data in the database.
I am working on real-time-collaboration-for-angular.

sample builds are missing the users plugin

tried the existing pre-built samples to test track changes with comments...no luck, missing 'Users' plugin :-(

ui_page.do?sys_id=e0c5a42a4f0333009a964bff9310c7d2:278 CKEditorError: plugincollection-plugin-not-loaded: The requested plugin is not loaded. Read more: https://ckeditor.com/docs/ckeditor5/latest/framework/guides/support/error-codes.html#error-plugincollection-plugin-not-loaded
{"plugin":"Users"}
at Ta.get (https://cdn.ckeditor.com/ckeditor5/12.3.1/classic/ckeditor.js:5:256941)
at TrackChangesIntegration.init (https://dev52524.service-now.com/ui_page.do?sys_id=e0c5a42a4f0333009a964bff9310c7d2:216:45)

Missing PHP samples

The readme for PHP says:

Note: The comments and track changes integrations are loaded separately — not as a part of the build. You do not need to recompile the build if you want to modify the adapters. They are loaded as regular JavaScript code on the sample page, so you will see any changes as soon as you refresh the page.

However, it appears the samples folder is missing. Is this intentional?

Create additional asynchronous samples for Vue

Currently, we only offer samples for Angular and React that showcase how to integrate the asynchronous Track changes and Revision history with these frameworks.

Similar samples for Vue could also be prapared.

unable to clone repo to customize build

unable to clone repo

$ git clone [email protected]:ckeditor/ckeditor5-collaboration-samples.git
Cloning into 'ckeditor5-collaboration-samples'...
Warning: Permanently added the RSA host key for IP address 'xxx.xxx.xxx.xxx' to the list of known hosts.
[email protected]: Permission denied (publickey).
fatal: Could not read from remote repository.

Unable to integrate angular 5

ERROR in ./build/classic-editor-with-real-time-collaboration.js
Module parse failed: Unexpected token (43203:7)
You may need an appropriate loader to handle this file type.
| t.model.change(t => {
| for (const [e, n] of s) t.setAttributes({
| ...pm,
| ...n
| }, e)

RTC with autosave

@pjasiun hey thanks for adding the new classic editor with real time collaboration and track changes and comments! I notice you didn't include the autosave plugin. Is it compatible with autosave?

Can't build real-time-collaboration-revision-history-for-react

Tried building build real-time-collaboration-revision-history-for-react using npm install per the README, but got:

npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR!
npm ERR! While resolving: [email protected]
npm ERR! Found: [email protected]
npm ERR! node_modules/webpack
npm ERR!   dev webpack@"^5.73.0" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer webpack@"^4.0.0" from [email protected]
npm ERR! node_modules/uglifyjs-webpack-plugin
npm ERR!   dev uglifyjs-webpack-plugin@"^2.2.0" from the root project
npm ERR!
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
npm ERR!
npm ERR!
npm ERR! For a full report see:
npm ERR! C:\Users\myusername\AppData\Local\npm-cache\_logs\2024-04-22T18_26_10_640Z-eresolve-report.txt

npm ERR! A complete log of this run can be found in: C:\Users\myusername\AppData\Local\npm-cache\_logs\2024-04-22T18_26_10_640Z-debug-0.log

Add real time collaboration to PHP example

I'd like to request that you add real time collaboration to the PHP example. I'm very interested in seeing it all tied together with real-time collaboration, track, changes, comments, and the adapter integrations.

e.addRevisionData is not a function

Hi,

I am currently following the RevisionHistoryAdapter integration, and here is my adapter,

class RevisionHistoryAdapter {
	constructor( editor ) {
		this.editor = editor;
	}

	static get pluginName() {
		return 'RevisionHistoryAdapter';
	}

	static get requires() {
		return [ 'RevisionHistory' ];
	}

	init() {
		const revisionHistory = this.editor.plugins.get( 'RevisionHistory' );

		revisionHistory.adapter = {
			getRevision: ( { revisionId } ) => {
				// Get revision data, based on its id.
				// This should be an asynchronous request to your database.
				// Do not dump your revisions data here -- this is only for testing purposes.
				switch ( revisionId ) {
					case 'initial':
						return Promise.resolve(
							{
								"id": "initial",
								"name": "Initial revision",
								"creatorId": "u1",
								"authorsIds": [ "u1" ],
								"diffData": {
									"main": {
										"insertions": '[{"name":"h1","attributes":[],"children":["PUBLISHING AGREEMENT"]},{"name":"h3","attributes":[],"children":["Introduction"]},{"name":"p","attributes":[],"children":["This publishing contract, the “contract”, is entered into as of ………… by and between The Lower Shelf, the “Publisher”, and …………, the “Author”."]},{"name":"h3","attributes":[],"children":["Grant of Rights"]},{"name":"p","attributes":[],"children":["The Author grants the Publisher full right and title to the following, in perpetuity:"]},{"name":"ul","attributes":[],"children":[{"name":"li","attributes":[],"children":["To publish, sell, and profit from the listed works in all languages and formats in existence today and at any point in the future."]},{"name":"li","attributes":[],"children":["To create or devise modified, abridged, or derivative works based on the works listed."]},{"name":"li","attributes":[],"children":["To allow others to use the listed works at their discretion, without providing additional compensation to the Author."]}]},{"name":"p","attributes":[],"children":["These rights are granted by the Author on behalf of him/herself and their successors, heirs, executors, and any other party who may attempt to lay claim to these rights at any point now or in the future."]},{"name":"p","attributes":[],"children":["Any rights not granted to the Publisher above remain with the Author."]},{"name":"p","attributes":[],"children":["The rights granted to the Publisher by the Author shall not be constrained by geographic territories and are considered global in nature."]},{"name":"p","attributes":[],"children":["Publishing formats are enumerated in Appendix A."]}]',
										"deletions": '[{"name":"h1","attributes":[],"children":["PUBLISHING AGREEMENT"]},{"name":"h3","attributes":[],"children":["Introduction"]},{"name":"p","attributes":[],"children":["This publishing contract, the “contract”, is entered into as of ………… by and between The Lower Shelf, the “Publisher”, and …………, the “Author”."]},{"name":"h3","attributes":[],"children":["Grant of Rights"]},{"name":"p","attributes":[],"children":["The Author grants the Publisher full right and title to the following, in perpetuity:"]},{"name":"ul","attributes":[],"children":[{"name":"li","attributes":[],"children":["To publish, sell, and profit from the listed works in all languages and formats in existence today and at any point in the future."]},{"name":"li","attributes":[],"children":["To create or devise modified, abridged, or derivative works based on the works listed."]},{"name":"li","attributes":[],"children":["To allow others to use the listed works at their discretion, without providing additional compensation to the Author."]}]},{"name":"p","attributes":[],"children":["These rights are granted by the Author on behalf of him/herself and their successors, heirs, executors, and any other party who may attempt to lay claim to these rights at any point now or in the future."]},{"name":"p","attributes":[],"children":["Any rights not granted to the Publisher above remain with the Author."]},{"name":"p","attributes":[],"children":["The rights granted to the Publisher by the Author shall not be constrained by geographic territories and are considered global in nature."]},{"name":"p","attributes":[],"children":["Publishing formats are enumerated in Appendix A."]}]'
									}
								},
								"createdAt": "2021-05-27T13:22:59.077Z",
								"attributes": {},
								"fromVersion": 1,
								"toVersion": 1
							}
						);
					case 'e6f80e6be6ee6057fd5a449ab13fba25d':
						return Promise.resolve(
							{
								"id": "e6f80e6be6ee6057fd5a449ab13fba25d",
								"name": "Updated with the actual data",
								"creatorId": "u1",
								"authorsIds": [ "u1" ],
								"diffData": {
									"main": {
										"insertions": '[{"name":"h1","attributes":[],"children":["PUBLISHING AGREEMENT"]},{"name":"h3","attributes":[],"children":["Introduction"]},{"name":"p","attributes":[],"children":["This publishing contract, the “contract”, is entered into as of ",{"name":"revision-start","attributes":[["name","insertion:u1:0"]],"children":[]},"1st",{"name":"revision-end","attributes":[["name","insertion:u1:0"]],"children":[]}," ",{"name":"revision-start","attributes":[["name","insertion:u1:1"]],"children":[]},"June 2020 ",{"name":"revision-end","attributes":[["name","insertion:u1:1"]],"children":[]},"by and between The Lower Shelf, the “Publisher”, and ",{"name":"revision-start","attributes":[["name","insertion:u1:2"]],"children":[]},"John Smith",{"name":"revision-end","attributes":[["name","insertion:u1:2"]],"children":[]},", the “Author”."]},{"name":"h3","attributes":[],"children":["Grant of Rights"]},{"name":"p","attributes":[],"children":["The Author grants the Publisher full right and title to the following, in perpetuity:"]},{"name":"ul","attributes":[],"children":[{"name":"li","attributes":[],"children":["To publish, sell, and profit from the listed works in all languages and formats in existence today and at any point in the future."]},{"name":"li","attributes":[],"children":["To create or devise modified, abridged, or derivative works based on the works listed."]},{"name":"li","attributes":[],"children":["To allow others to use the listed works at their discretion, without providing additional compensation to the Author."]}]},{"name":"p","attributes":[],"children":["These rights are granted by the Author on behalf of him and their successors, heirs, executors, and any other party who may attempt to lay claim to these rights at any point now or in the future."]},{"name":"p","attributes":[],"children":["Any rights not granted to the Publisher above remain with the Author."]},{"name":"p","attributes":[],"children":["The rights granted to the Publisher by the Author shall not be constrained by geographic territories and are considered global in nature."]}]',
										"deletions": '[{"name":"h1","attributes":[],"children":["PUBLISHING AGREEMENT"]},{"name":"h3","attributes":[],"children":["Introduction"]},{"name":"p","attributes":[],"children":["This publishing contract, the “contract”, is entered into as of ",{"name":"revision-start","attributes":[["name","deletion:u1:0"]],"children":[]},"…………",{"name":"revision-end","attributes":[["name","deletion:u1:0"]],"children":[]}," by and between The Lower Shelf, the “Publisher”, and ",{"name":"revision-start","attributes":[["name","deletion:u1:1"]],"children":[]},"…………",{"name":"revision-end","attributes":[["name","deletion:u1:1"]],"children":[]},", the “Author”."]},{"name":"h3","attributes":[],"children":["Grant of Rights"]},{"name":"p","attributes":[],"children":["The Author grants the Publisher full right and title to the following, in perpetuity:"]},{"name":"ul","attributes":[],"children":[{"name":"li","attributes":[],"children":["To publish, sell, and profit from the listed works in all languages and formats in existence today and at any point in the future."]},{"name":"li","attributes":[],"children":["To create or devise modified, abridged, or derivative works based on the works listed."]},{"name":"li","attributes":[],"children":["To allow others to use the listed works at their discretion, without providing additional compensation to the Author."]}]},{"name":"p","attributes":[],"children":["These rights are granted by the Author on behalf of him",{"name":"revision-start","attributes":[["name","deletion:u1:2"]],"children":[]},"/herself",{"name":"revision-end","attributes":[["name","deletion:u1:2"]],"children":[]}," and their successors, heirs, executors, and any other party who may attempt to lay claim to these rights at any point now or in the future."]},{"name":"p","attributes":[],"children":["Any rights not granted to the Publisher above remain with the Author."]},{"name":"p","attributes":[],"children":["The rights granted to the Publisher by the Author shall not be constrained by geographic territories and are considered global in nature.",{"name":"revision-start","attributes":[["name","deletion:u1:3"]],"children":[]}]},{"name":"p","attributes":[],"children":["Publishing formats are enumerated in Appendix A.",{"name":"revision-end","attributes":[["name","deletion:u1:3"]],"children":[]}]}]'
									}
								},
								"createdAt": "2021-05-27T13:23:52.553Z",
								"attributes": {},
								"fromVersion": 1,
								"toVersion": 20
							}
						);
					case 'e6590c50ccbc86acacb7d27231ad32064':
						return Promise.resolve(
							{
								"id": "e6590c50ccbc86acacb7d27231ad32064",
								"name": "Inserted logo",
								"creatorId": "u1",
								"authorsIds": [ "u1" ],
								"diffData": {
									"main": {
										"insertions": '[{"name":"figure","attributes":[["data-revision-start-before","insertion:u1:0"],["class","image"]],"children":[{"name":"img","attributes":[["src","../../assets/img/revision-history-demo.png"]],"children":[]}]},{"name":"h1","attributes":[],"children":[{"name":"revision-end","attributes":[["name","insertion:u1:0"]],"children":[]},"PUBLISHING AGREEMENT"]},{"name":"h3","attributes":[],"children":["Introduction"]},{"name":"p","attributes":[],"children":["This publishing contract, the “contract”, is entered into as of 1st June 2020 by and between The Lower Shelf, the “Publisher”, and John Smith, the “Author”."]},{"name":"h3","attributes":[],"children":["Grant of Rights"]},{"name":"p","attributes":[],"children":["The Author grants the Publisher full right and title to the following, in perpetuity:"]},{"name":"ul","attributes":[],"children":[{"name":"li","attributes":[],"children":["To publish, sell, and profit from the listed works in all languages and formats in existence today and at any point in the future."]},{"name":"li","attributes":[],"children":["To create or devise modified, abridged, or derivative works based on the works listed."]},{"name":"li","attributes":[],"children":["To allow others to use the listed works at their discretion, without providing additional compensation to the Author."]}]},{"name":"p","attributes":[],"children":["These rights are granted by the Author on behalf of him and their successors, heirs, executors, and any other party who may attempt to lay claim to these rights at any point now or in the future."]},{"name":"p","attributes":[],"children":["Any rights not granted to the Publisher above remain with the Author."]},{"name":"p","attributes":[],"children":["The rights granted to the Publisher by the Author shall not be constrained by geographic territories and are considered global in nature."]}]',
										"deletions": '[{"name":"h1","attributes":[["data-revision-start-before","deletion:u1:0"]],"children":[{"name":"revision-end","attributes":[["name","deletion:u1:0"]],"children":[]},"PUBLISHING AGREEMENT"]},{"name":"h3","attributes":[],"children":["Introduction"]},{"name":"p","attributes":[],"children":["This publishing contract, the “contract”, is entered into as of 1st June 2020 by and between The Lower Shelf, the “Publisher”, and John Smith, the “Author”."]},{"name":"h3","attributes":[],"children":["Grant of Rights"]},{"name":"p","attributes":[],"children":["The Author grants the Publisher full right and title to the following, in perpetuity:"]},{"name":"ul","attributes":[],"children":[{"name":"li","attributes":[],"children":["To publish, sell, and profit from the listed works in all languages and formats in existence today and at any point in the future."]},{"name":"li","attributes":[],"children":["To create or devise modified, abridged, or derivative works based on the works listed."]},{"name":"li","attributes":[],"children":["To allow others to use the listed works at their discretion, without providing additional compensation to the Author."]}]},{"name":"p","attributes":[],"children":["These rights are granted by the Author on behalf of him and their successors, heirs, executors, and any other party who may attempt to lay claim to these rights at any point now or in the future."]},{"name":"p","attributes":[],"children":["Any rights not granted to the Publisher above remain with the Author."]},{"name":"p","attributes":[],"children":["The rights granted to the Publisher by the Author shall not be constrained by geographic territories and are considered global in nature."]}]'
									}
								},
								"createdAt": "2021-05-27T13:26:39.252Z",
								"attributes": {},
								"fromVersion": 20,
								"toVersion": 24
							}
						);
					case 'egh91t5jccbi894cacxx7dz7t36aj3k021':
						return Promise.resolve(
							{
								"id": "egh91t5jccbi894cacxx7dz7t36aj3k021",
								"name": null,
								"creatorId": null,
								"authorsIds": [],
								"diffData": {
									"main": {
										"insertions": '[{"name":"figure","attributes":[["class","image"]],"children":[{"name":"img","attributes":[["src","../../assets/img/revision-history-demo.png"]],"children":[]}]},{"name":"h1","attributes":[],"children":["PUBLISHING AGREEMENT"]},{"name":"h3","attributes":[],"children":["Introduction"]},{"name":"p","attributes":[],"children":["This publishing contract, the “contract”, is entered into as of 1st June 2020 by and between The Lower Shelf, the “Publisher”, and John Smith, the “Author”."]},{"name":"h3","attributes":[],"children":["Grant of Rights"]},{"name":"p","attributes":[],"children":["The Author grants the Publisher full right and title to the following, in perpetuity:"]},{"name":"ul","attributes":[],"children":[{"name":"li","attributes":[],"children":["To publish, sell, and profit from the listed works in all languages and formats in existence today and at any point in the future."]},{"name":"li","attributes":[],"children":["To create or devise modified, abridged, or derivative works based on the works listed."]},{"name":"li","attributes":[],"children":["To allow others to use the listed works at their discretion, without providing additional compensation to the Author."]}]},{"name":"p","attributes":[],"children":["These rights are granted by the Author on behalf of him and their successors, heirs, executors, and any other party who may attempt to lay claim to these rights at any point now or in the future."]},{"name":"p","attributes":[],"children":["Any rights not granted to the Publisher above remain with the Author."]},{"name":"p","attributes":[],"children":["The rights granted to the Publisher by the Author shall not be constrained by geographic territories and are considered global in nature."]}]',
										"deletions": '[{"name":"h1","attributes":[],"children":["PUBLISHING AGREEMENT"]},{"name":"h3","attributes":[],"children":["Introduction"]},{"name":"p","attributes":[],"children":["This publishing contract, the “contract”, is entered into as of 1st June 2020 by and between The Lower Shelf, the “Publisher”, and John Smith, the “Author”."]},{"name":"h3","attributes":[],"children":["Grant of Rights"]},{"name":"p","attributes":[],"children":["The Author grants the Publisher full right and title to the following, in perpetuity:"]},{"name":"ul","attributes":[],"children":[{"name":"li","attributes":[],"children":["To publish, sell, and profit from the listed works in all languages and formats in existence today and at any point in the future."]},{"name":"li","attributes":[],"children":["To create or devise modified, abridged, or derivative works based on the works listed."]},{"name":"li","attributes":[],"children":["To allow others to use the listed works at their discretion, without providing additional compensation to the Author."]}]},{"name":"p","attributes":[],"children":["These rights are granted by the Author on behalf of him and their successors, heirs, executors, and any other party who may attempt to lay claim to these rights at any point now or in the future."]},{"name":"p","attributes":[],"children":["Any rights not granted to the Publisher above remain with the Author."]},{"name":"p","attributes":[],"children":["The rights granted to the Publisher by the Author shall not be constrained by geographic territories and are considered global in nature."]}]'
									}
								},
								"createdAt": "2021-05-27T13:26:39.252Z",
								"attributes": {},
								"fromVersion": 24,
								"toVersion": 24
							}
						);
				}
			},
			updateRevisions: revisionsData => {
				const documentData = this.editor.getData();

				// This should be an asynchronous request to your database
				// that saves `revisionsData` and `documentData`.
				//
				// `revisionsData` is an array with object, each object contains updated and new revisions.
				// See API reference to learn more.
				return Promise.resolve();
			}
		};

		// Add the revisions data for existing revisions.
		// You can either dump the revisions data straight in the source code, or
		// you can fetch the data asynchronously from your database (as this example shows).
		//
		// Note that the revisions data does not contain `diffData` property.
		// `diffData` property may be big and will be fetched on demand by `adapter.getRevision()`.
		//
		const revisionsData = [
			{
				"id": "initial",
				"name": "Initial revision",
				"creatorId": "u1",
				"authorsIds": [ "u1" ],
				"createdAt": "2021-05-27T13:22:59.077Z",
				"attributes": {},
				"fromVersion": 1,
				"toVersion": 1
			},
			{
				"id": "e6f80e6be6ee6057fd5a449ab13fba25d",
				"name": "Updated with the actual data",
				"creatorId": "u1",
				"authorsIds": [ "u1" ],
				"createdAt": "2021-05-27T13:23:52.553Z",
				"attributes": {},
				"fromVersion": 1,
				"toVersion": 20
			},
			{
				"id": "e6590c50ccbc86acacb7d27231ad32064",
				"name": "Inserted logo",
				"creatorId": "u1",
				"authorsIds": [ "u1" ],
				"createdAt": "2021-05-27T13:26:39.252Z",
				"attributes": {},
				"fromVersion": 20,
				"toVersion": 24
			},
			// Empty current revision:
			{
				"id": "egh91t5jccbi894cacxx7dz7t36aj3k021",
				"name": null,
				"creatorId": null,
				"authorsIds": [],
				"createdAt": "2021-05-27T13:26:39.252Z",
				"attributes": {},
				"fromVersion": 24,
				"toVersion": 24
			}
		]
		
		for ( const revisionData of revisionsData ) {
			revisionHistory.addRevisionData( revisionData );
		}

	}
}

While i try to load it gives me the following error:

There was a problem initializing the editor. TypeError: e.addRevisionData is not a function
    at LR.defaultConfig.extraPlugins.init (ckeditor.js:471:20)

Version: "@ckeditor/ckeditor5-revision-history": "31.1.0"

Want to get rid of Dialog Box , I want to make a automated program that directly opens the Editor.

81405124-adf4bf80-9154-11ea-8e6f-9ae3d7e8c3e4

Previously posted by you to hardcode the classic-editor-with-real-time-collaboration.html, but it doesn't work
and you only suggested for the URL's but if write tokens then a drop-down comes to select the names of the user, and I don't want the list to come and directly wants an automated software that works on different channels.
If I will be purchasing the token then the dialogue will be removed or then also I have to hardcode for that.

TypeScript?

It would be awesome to see the examples converted to TypeScript.

Throw error when 'npm run serve' \real-time-collaboration-for-vue.

Error is as follows :
`This relative module was not found:

  • ../../../ckeditor-cloud-services-collaboration/src/comments-v2/commentsservice in ./node_modules/_@[email protected]@@ckeditor/ckeditor5-real-time-collaboration/src/realtimecollaborativecomments/cloudservicescommentsadapter.js`

The problem is solved by modify path of import.But a new error has occurred after construction in browser.

in .\node_modules@ckeditor\ckeditor5-ui\src\icon\iconview.js

_updateXMLContent() {
     if ( this.content ) {

        const parsed = new DOMParser().parseFromString( this.content.trim(),'image/svg+xml' );
        const svg = parsed.querySelector( 'svg' );
        const viewBox = svg.getAttribute( 'viewBox' );

this.content === "img/previous-arrow.79ed695f.svg";
Lead to svg = null.Uncaught (in promise) TypeError: Cannot read property 'getAttribute' of null

Feature request: adapter integration for a common DB

I'd love to see an example adapter integration for a common DB with REST support so that it can be easily used for web pages without having to write a custom adapter. I don't really care which DB you choose as long as it's accessible from a browser. For example, it could be S3, MongoDB, Firestore, etc. It would save so much time being able to plugin a ready made solution than building my own adapter from scratch.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.