fix user selection issues
This commit is contained in:
parent
b7dbcf69d3
commit
b35092928e
51
src/Type/y-xml/domFilter.js
Normal file
51
src/Type/y-xml/domFilter.js
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
|
||||||
|
const filterMap = new Map()
|
||||||
|
|
||||||
|
export function addFilter (type, filter) {
|
||||||
|
if (!filterMap.has(type)) {
|
||||||
|
filterMap.set(type, new Set())
|
||||||
|
}
|
||||||
|
const filters = filterMap.get(type)
|
||||||
|
filters.add(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function executeFilter (type) {
|
||||||
|
const y = type._y
|
||||||
|
let parent = type
|
||||||
|
const nodeName = type.nodeName
|
||||||
|
let attributes = new Map()
|
||||||
|
if (type.getAttributes !== undefined) {
|
||||||
|
let attrs = type.getAttributes()
|
||||||
|
for (let key in attrs) {
|
||||||
|
attributes.set(key, attrs[key])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let filteredAttributes = new Map(attributes)
|
||||||
|
// is not y, supports dom filtering
|
||||||
|
while (parent !== y && parent.setDomFilter != null) {
|
||||||
|
const filters = filterMap.get(parent)
|
||||||
|
if (filters !== undefined) {
|
||||||
|
for (let f of filters) {
|
||||||
|
filteredAttributes = f(nodeName, filteredAttributes)
|
||||||
|
if (filteredAttributes === null) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (filteredAttributes === null) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
parent = parent._parent
|
||||||
|
}
|
||||||
|
if (filteredAttributes === null) {
|
||||||
|
type._delete(y)
|
||||||
|
} else {
|
||||||
|
// iterate original attributes
|
||||||
|
attributes.forEach((value, key) => {
|
||||||
|
// delete all attributes that are not in filteredAttributes
|
||||||
|
if (!filteredAttributes.has(key)) {
|
||||||
|
type.removeAttribute(key)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
@ -68,6 +68,7 @@ export function afterTransactionSelectionFixer (y, transaction, remote) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (shouldUpdate) {
|
if (shouldUpdate) {
|
||||||
|
console.info('updating selection!!')
|
||||||
browserSelection.setBaseAndExtent(
|
browserSelection.setBaseAndExtent(
|
||||||
anchorNode,
|
anchorNode,
|
||||||
anchorOffset,
|
anchorOffset,
|
||||||
|
@ -7,13 +7,13 @@ export function getRelativePosition (type, offset) {
|
|||||||
} else {
|
} else {
|
||||||
let t = type._start
|
let t = type._start
|
||||||
while (t !== null) {
|
while (t !== null) {
|
||||||
if (t._length >= offset) {
|
if (t._deleted === false) {
|
||||||
return [t._id.user, t._id.clock + offset - 1]
|
if (t._length >= offset) {
|
||||||
}
|
return [t._id.user, t._id.clock + offset - 1]
|
||||||
if (t._right === null) {
|
}
|
||||||
return [t._id.user, t._id.clock + t._length - 1]
|
if (t._right === null) {
|
||||||
}
|
return [t._id.user, t._id.clock + t._length - 1]
|
||||||
if (!t._deleted) {
|
}
|
||||||
offset -= t._length
|
offset -= t._length
|
||||||
}
|
}
|
||||||
t = t._right
|
t = t._right
|
||||||
|
Loading…
x
Reference in New Issue
Block a user