mirror of
https://github.com/yjs/yjs.git
synced 2025-12-14 18:57:45 +01:00
fixed nested delta edge case
This commit is contained in:
@@ -479,7 +479,8 @@ export class AbstractType {
|
||||
* @type {EventDelta extends delta.Delta<infer N,infer Attrs,infer Children,infer Text,any> ? delta.DeltaBuilder<N,Attrs,Children,Text,any> : never}
|
||||
*/
|
||||
const d = /** @type {any} */ (delta.create(/** @type {any} */ (this).nodeName || null))
|
||||
typeMapGetDelta(d, /** @type {any} */ (this), renderAttrs, am, deep, modified, deletedItems, itemsToRender, opts)
|
||||
const optsAll = modified == null ? opts : object.assign({}, opts, { modified: null })
|
||||
typeMapGetDelta(d, /** @type {any} */ (this), renderAttrs, am, deep, modified, deletedItems, itemsToRender, opts, optsAll)
|
||||
if (renderChildren) {
|
||||
/**
|
||||
* @type {delta.FormattingAttributes}
|
||||
@@ -571,7 +572,7 @@ export class AbstractType {
|
||||
if (c.deleted ? retainDeletes : retainInserts) {
|
||||
d.retain(c.content.getLength(), null, attribution ?? {})
|
||||
} else if (deep && c.content.constructor === ContentType) {
|
||||
d.insert([/** @type {any} */(c.content).type.getContent(am, opts)], null, attribution)
|
||||
d.insert([/** @type {any} */(c.content).type.getContent(am, optsAll)], null, attribution)
|
||||
} else {
|
||||
d.insert(c.content.getContent(), null, attribution)
|
||||
}
|
||||
@@ -1314,11 +1315,12 @@ export const typeMapGetAll = (parent) => {
|
||||
* @param {import('../utils/IdSet.js').IdSet?} [deletedItems]
|
||||
* @param {import('../utils/IdSet.js').IdSet?} [itemsToRender]
|
||||
* @param {any} [opts]
|
||||
* @param {any} [optsAll]
|
||||
*
|
||||
* @private
|
||||
* @function
|
||||
*/
|
||||
export const typeMapGetDelta = (d, parent, attrsToRender, am, deep, modified, deletedItems, itemsToRender, opts) => {
|
||||
export const typeMapGetDelta = (d, parent, attrsToRender, am, deep, modified, deletedItems, itemsToRender, opts, optsAll) => {
|
||||
// @todo support modified ops!
|
||||
/**
|
||||
* @param {Item} item
|
||||
@@ -1348,7 +1350,7 @@ export const typeMapGetDelta = (d, parent, attrsToRender, am, deep, modified, de
|
||||
}
|
||||
const prevValue = (prevContentItem !== item && itemsToRender?.hasId(prevContentItem.lastId)) ? array.last(prevContentItem.content.getContent()) : undefined
|
||||
if (deep && c instanceof AbstractType) {
|
||||
c = /** @type {any} */(c).getContent(am)
|
||||
c = /** @type {any} */(c).getContent(am, optsAll)
|
||||
}
|
||||
d.set(key, c, attribution, prevValue)
|
||||
}
|
||||
|
||||
@@ -107,3 +107,27 @@ export const testYdocDiff = () => {
|
||||
.update('map', delta.create().set('newk', 42, { insert: [] }).update('nested', delta.create().insert([1], null, { insert: [] })))
|
||||
)
|
||||
}
|
||||
|
||||
export const testChildListContent = () => {
|
||||
const ydocStart = new Y.Doc()
|
||||
const ydocUpdated = Y.cloneDoc(ydocStart)
|
||||
const yf = new Y.XmlElement('test')
|
||||
let calledEvent = 0
|
||||
yf.applyDelta(delta.create().insert('test content').set('k', 'v'))
|
||||
|
||||
const yarray = ydocUpdated.getArray('array')
|
||||
yarray.observeDeep((events, tr) => {
|
||||
calledEvent++
|
||||
const event = events.find(event => event.target === yarray) || new Y.YEvent(yarray, tr, new Set(null))
|
||||
const d = event.deltaDeep
|
||||
const expectedD = delta.create().insert([delta.create('test').insert('test content').set('k', 'v')])
|
||||
t.compare(d, expectedD)
|
||||
})
|
||||
ydocUpdated.getArray('array').insert(0, [yf])
|
||||
t.assert(calledEvent === 1)
|
||||
const d = Y.diffDocsToDelta(ydocStart, ydocUpdated)
|
||||
console.log('calculated diff', d.toJSON())
|
||||
t.compare(d, delta.create()
|
||||
.update('array', delta.create().insert([delta.create('test').insert('test content', null, { insert: [] }).set('k', 'v', { insert: [] })], null, { insert: [] }))
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user