diff --git a/wax-prosemirror-components/src/components/findAndReplace/FindComponent.js b/wax-prosemirror-components/src/components/findAndReplace/FindComponent.js index 0f77bbc400427b2673afdbdc0f574aa0fdbe1e58..dbf3046d977223b3ea12218161707f720473d47e 100644 --- a/wax-prosemirror-components/src/components/findAndReplace/FindComponent.js +++ b/wax-prosemirror-components/src/components/findAndReplace/FindComponent.js @@ -178,17 +178,44 @@ const FindComponent = ({ close, expand, setPreviousSearcValue }) => { return allResults; }; + const closest = (selectionFrom, results) => { + return results.reduce((a, b) => { + const aDiff = Math.abs(a - selectionFrom); + const bDiff = Math.abs(b - selectionFrom); + + if (aDiff === bDiff) { + return a > b ? a : b; + } + return bDiff < aDiff ? b : a; + }); + }; + const findNext = () => { const results = getAllResultsByView(); const currentSelection = view[activeViewId].state.selection; - // console.log(results, activeViewId, currentSelection); + const resultsFrom = {}; + + each(results, (result, viewId) => { + result.forEach(res => { + if (!resultsFrom[viewId]) { + resultsFrom[viewId] = [res.from]; + } else { + resultsFrom[viewId].push(res.from); + } + }); + }); + + const found = closest(currentSelection.from, resultsFrom[activeViewId]); + const position = resultsFrom[activeViewId].indexOf(found); const selectionFrom = new TextSelection( - view[activeViewId].state.doc.resolve(results[activeViewId][0].from), + view[activeViewId].state.doc.resolve( + results[activeViewId][position].from, + ), ); const selectionTo = new TextSelection( - view[activeViewId].state.doc.resolve(results[activeViewId][0].to), + view[activeViewId].state.doc.resolve(results[activeViewId][position].to), ); view[activeViewId].dispatch(