diff --git a/README.md b/README.md index 94c0b770..48e7c555 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,13 @@ text, richtext, json, or XML. It is fairly easy to get started, as Yjs hides most of the complexity of concurrent editing. For additional information, demos, and tutorials visit [y-js.org](http://y-js.org/). +>**If you ever felt like giving back - now is the time! Me and a group of friends have organized a fundraiser to bring heathy food to unprivileged children in Vegas. Good food is often hard to come by. Thus some children don’t eat vegetables on a regular basis. We are offering free daily meals with fresh produce and we are going to build a self-sustainable garden at an elementary school to educate children how to live healthy. https://urbanseedfoundation.networkforgood.com/projects/48182-kevin-jahns-s-fundraiser** +> +> Your support on my funding page would mean the world to me :raised_hands: +> +> Also check the description in the link above: If we get to 2500$, I'm going to publish a premium Yjs documentation for the upcoming v13 release! There are also some other goals. The fundraising campaign ends very soon! + + ### Extensions Yjs only knows how to resolve conflicts on shared data. You have to choose a .. * *Connector* - a communication protocol that propagates changes to the clients diff --git a/package-lock.json b/package-lock.json index 33bed4c4..f33b7b24 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "yjs", - "version": "13.0.0-53", + "version": "13.0.0-54", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 484e811b..9de600a2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "yjs", - "version": "13.0.0-53", + "version": "13.0.0-54", "description": "A framework for real-time p2p shared editing on any data", "main": "./y.node.js", "browser": "./y.js", diff --git a/src/Struct/Item.js b/src/Struct/Item.js index 561bd725..f7487f70 100644 --- a/src/Struct/Item.js +++ b/src/Struct/Item.js @@ -91,18 +91,19 @@ export default class Item { if (parent._redone !== null) { parent = parent._redone // find next cloned items - while (left !== null && left._redone === null) { + while (left !== null) { + if (left._redone !== null && left._redone._parent === parent) { + left = left._redone + break + } left = left._left } - if (left !== null) { - left = left._redone - } - while (right !== null && right._redone === null) { + while (right !== null) { + if (right._redone !== null && right._redone._parent === parent) { + right = right._redone + } right = right._right } - if (right !== null) { - right = right._redone - } } struct._origin = left struct._left = left diff --git a/src/Util/UndoManager.js b/src/Util/UndoManager.js index 56cf2d95..54adbbde 100644 --- a/src/Util/UndoManager.js +++ b/src/Util/UndoManager.js @@ -72,6 +72,7 @@ export default class UndoManager { this._scope = scope this._undoing = false this._redoing = false + this._lastTransactionWasUndo = false const y = scope._y this.y = y y.on('afterTransaction', (y, transaction, remote) => { @@ -79,7 +80,12 @@ export default class UndoManager { let reverseOperation = new ReverseOperation(y, transaction) if (!this._undoing) { let lastUndoOp = this._undoBuffer.length > 0 ? this._undoBuffer[this._undoBuffer.length - 1] : null - if (lastUndoOp !== null && reverseOperation.created - lastUndoOp.created <= options.captureTimeout) { + if ( + this._redoing === false && + this._lastTransactionWasUndo === false && + lastUndoOp !== null && + reverseOperation.created - lastUndoOp.created <= options.captureTimeout + ) { lastUndoOp.created = reverseOperation.created if (reverseOperation.toState !== null) { lastUndoOp.toState = reverseOperation.toState @@ -89,12 +95,14 @@ export default class UndoManager { } reverseOperation.deletedStructs.forEach(lastUndoOp.deletedStructs.add, lastUndoOp.deletedStructs) } else { + this._lastTransactionWasUndo = false this._undoBuffer.push(reverseOperation) } if (!this._redoing) { this._redoBuffer = [] } } else { + this._lastTransactionWasUndo = true this._redoBuffer.push(reverseOperation) } }