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) {
 | 
					 | 
				
			||||||
        // @ts-ignore
 | 
					 | 
				
			||||||
        content.doc = null
 | 
					 | 
				
			||||||
      } else {
 | 
					 | 
				
			||||||
      content.doc = new Doc({ guid: this.guid, ...content.opts, shouldLoad: false })
 | 
					      content.doc = new Doc({ guid: this.guid, ...content.opts, shouldLoad: false })
 | 
				
			||||||
      content.doc._item = item
 | 
					      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