fix undoing of content containing subdocs
This commit is contained in:
parent
4154b12f14
commit
9a7250f192
@ -5,6 +5,12 @@ import {
|
|||||||
|
|
||||||
import * as error from 'lib0/error'
|
import * as error from 'lib0/error'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} guid
|
||||||
|
* @param {Object<string, any>} opts
|
||||||
|
*/
|
||||||
|
const createDocFromOpts = (guid, opts) => new Doc({ guid, ...opts, shouldLoad: opts.shouldLoad || opts.autoLoad || false })
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
@ -61,7 +67,7 @@ export class ContentDoc {
|
|||||||
* @return {ContentDoc}
|
* @return {ContentDoc}
|
||||||
*/
|
*/
|
||||||
copy () {
|
copy () {
|
||||||
return new ContentDoc(this.doc)
|
return new ContentDoc(createDocFromOpts(this.doc.guid, this.opts))
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -132,8 +138,4 @@ export class ContentDoc {
|
|||||||
* @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
|
* @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
|
||||||
* @return {ContentDoc}
|
* @return {ContentDoc}
|
||||||
*/
|
*/
|
||||||
export const readContentDoc = decoder => {
|
export const readContentDoc = decoder => new ContentDoc(createDocFromOpts(decoder.readString(), decoder.readAny()))
|
||||||
const guid = decoder.readString()
|
|
||||||
const opts = decoder.readAny()
|
|
||||||
return new ContentDoc(new Doc({ guid, ...opts, shouldLoad: opts.shouldLoad || opts.autoLoad || false }))
|
|
||||||
}
|
|
||||||
|
@ -249,13 +249,8 @@ export class Doc extends Observable {
|
|||||||
if (item !== null) {
|
if (item !== null) {
|
||||||
this._item = null
|
this._item = null
|
||||||
const content = /** @type {ContentDoc} */ (item.content)
|
const content = /** @type {ContentDoc} */ (item.content)
|
||||||
if (item.deleted) {
|
content.doc = new Doc({ guid: this.guid, ...content.opts, shouldLoad: false })
|
||||||
// @ts-ignore
|
content.doc._item = item
|
||||||
content.doc = null
|
|
||||||
} else {
|
|
||||||
content.doc = new Doc({ guid: this.guid, ...content.opts, shouldLoad: false })
|
|
||||||
content.doc._item = item
|
|
||||||
}
|
|
||||||
transact(/** @type {any} */ (item).parent.doc, transaction => {
|
transact(/** @type {any} */ (item).parent.doc, transaction => {
|
||||||
const doc = content.doc
|
const doc = content.doc
|
||||||
if (!item.deleted) {
|
if (!item.deleted) {
|
||||||
|
@ -213,3 +213,18 @@ export const testSubdocLoadEdgeCasesAutoload = tc => {
|
|||||||
t.assert(lastEvent !== null && lastEvent.added.has(subdoc3))
|
t.assert(lastEvent !== null && lastEvent.added.has(subdoc3))
|
||||||
t.assert(lastEvent !== null && lastEvent.loaded.has(subdoc3))
|
t.assert(lastEvent !== null && lastEvent.loaded.has(subdoc3))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {t.TestCase} tc
|
||||||
|
*/
|
||||||
|
export const testSubdocsUndo = tc => {
|
||||||
|
const ydoc = new Y.Doc()
|
||||||
|
const elems = ydoc.getXmlFragment()
|
||||||
|
const undoManager = new Y.UndoManager(elems)
|
||||||
|
const subdoc = new Y.Doc()
|
||||||
|
// @ts-ignore
|
||||||
|
elems.insert(0, [subdoc])
|
||||||
|
undoManager.undo()
|
||||||
|
undoManager.redo()
|
||||||
|
t.assert(elems.length === 1)
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user