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._deleted === false) {
 | 
				
			||||||
        if (t._length >= offset) {
 | 
					        if (t._length >= offset) {
 | 
				
			||||||
          return [t._id.user, t._id.clock + offset - 1]
 | 
					          return [t._id.user, t._id.clock + offset - 1]
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (t._right === null) {
 | 
					        if (t._right === null) {
 | 
				
			||||||
          return [t._id.user, t._id.clock + t._length - 1]
 | 
					          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