From e4da7905cae8188379e20a2197ff1ccdb410a471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Ho=CC=88=C3=9Fl?= Date: Sat, 20 Jan 2018 21:50:19 +0100 Subject: [PATCH] Fixes an edge case in the diff --- CHANGELOG | 2 +- openslides/motions/static/js/motions/diff.js | 13 +++++++++++++ tests/karma/motions/diff.service.test.js | 8 ++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 359658230..aba09595b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -38,7 +38,7 @@ Motions: - Bugfix: Several bugfixes regarding splitting list items in change recommendations [#3288]. - Bugfix: Several bugfixes regarding diff version [#3407, #3408, #3410, - #3440, #3450, #3465]. + #3440, #3450, #3465, #3537, #3546]. - Added inline Editing for motion reason [#3361]. - Added multiselect filter for motion comments [#3372]. - Added support for pinning personal notes to the window [#3360]. diff --git a/openslides/motions/static/js/motions/diff.js b/openslides/motions/static/js/motions/diff.js index 99f34540c..028a84a56 100644 --- a/openslides/motions/static/js/motions/diff.js +++ b/openslides/motions/static/js/motions/diff.js @@ -960,6 +960,19 @@ angular.module('OpenSlidesApp.motions.diff', ['OpenSlidesApp.motions.lineNumberi newStr = this._normalizeHtmlForDiff(newStr.replace(/\s+$/, '').replace(/^\s+/, '')); var out = this._diff(this._tokenizeHtml(oldStr), this._tokenizeHtml(newStr)); + + // This fixes the problem tested by "does not lose words when changes are moved X-wise" + var lastRow = 0; + for (var z = 0; z < out.n.length; z++) { + if (out.n[z].row && out.n[z].row > lastRow) { + lastRow = out.n[z].row; + } + if (out.n[z].row && out.n[z].row < lastRow) { + out.o[out.n[z].row] = out.o[out.n[z].row].text; + out.n[z] = out.n[z].text; + } + } + var str = ""; var i; diff --git a/tests/karma/motions/diff.service.test.js b/tests/karma/motions/diff.service.test.js index 919a8209a..d5452c7bd 100644 --- a/tests/karma/motions/diff.service.test.js +++ b/tests/karma/motions/diff.service.test.js @@ -598,6 +598,14 @@ describe('linenumbering', function () { expect(diff).toBe('

 sanctus est Lorem ipsum dolor sit amet. Test Lorem ipsum dolor sit amet, consetetur sadipscing

'); }); + + it('does not lose words when changes are moved X-wise', function () { + var before = 'elitr. einsetzt. VERSCHLUCKT noch die sog. Gleichbleibend (Wird gelöscht).', + after = 'elitr, Einfügung durch Änderung der Gleichbleibend, einsetzt.'; + + var diff = diffService.diff(before, after); + expect(diff).toBe('elitr. einsetzt. VERSCHLUCKT noch die sog., Einfügung durch Änderung der Gleichbleibend (Wird gelöscht)., einsetzt.'); + }); }); describe('ignoring line numbers', function () {