From b35092928ef7da9f4fae729a62f86c93f1550263 Mon Sep 17 00:00:00 2001 From: Kevin Jahns Date: Tue, 28 Nov 2017 17:32:51 -0800 Subject: [PATCH] fix user selection issues --- src/Type/y-xml/domFilter.js | 51 ++++++++++++++++++++++++++++++++++++ src/Type/y-xml/selection.js | 1 + src/Util/relativePosition.js | 14 +++++----- 3 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 src/Type/y-xml/domFilter.js diff --git a/src/Type/y-xml/domFilter.js b/src/Type/y-xml/domFilter.js new file mode 100644 index 00000000..ed992c53 --- /dev/null +++ b/src/Type/y-xml/domFilter.js @@ -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) + } + }) + } +} diff --git a/src/Type/y-xml/selection.js b/src/Type/y-xml/selection.js index 9b69007c..c2ce5911 100644 --- a/src/Type/y-xml/selection.js +++ b/src/Type/y-xml/selection.js @@ -68,6 +68,7 @@ export function afterTransactionSelectionFixer (y, transaction, remote) { } } if (shouldUpdate) { + console.info('updating selection!!') browserSelection.setBaseAndExtent( anchorNode, anchorOffset, diff --git a/src/Util/relativePosition.js b/src/Util/relativePosition.js index 5ab14b1c..fa292c53 100644 --- a/src/Util/relativePosition.js +++ b/src/Util/relativePosition.js @@ -7,13 +7,13 @@ export function getRelativePosition (type, offset) { } else { let t = type._start while (t !== null) { - 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._deleted) { + if (t._deleted === false) { + 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] + } offset -= t._length } t = t._right