From 3ac3a8e85a89403f9f2a7bff347b4f6163423aeb Mon Sep 17 00:00:00 2001 From: Artem Nistuley Date: Thu, 26 Feb 2026 14:07:55 +0200 Subject: [PATCH] fix: track highlight changes --- .../trackChangesHelpers/addMarkStep.js | 2 +- .../trackChangesHelpers/removeMarkStep.js | 2 +- .../trackChangesHelpers.test.js | 41 +++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/packages/super-editor/src/extensions/track-changes/trackChangesHelpers/addMarkStep.js b/packages/super-editor/src/extensions/track-changes/trackChangesHelpers/addMarkStep.js index b8df514ac3..6fd16bebb1 100644 --- a/packages/super-editor/src/extensions/track-changes/trackChangesHelpers/addMarkStep.js +++ b/packages/super-editor/src/extensions/track-changes/trackChangesHelpers/addMarkStep.js @@ -41,7 +41,7 @@ export const addMarkStep = ({ state, step, newTr, doc, user, date }) => { const wid = existingChangeMark ? existingChangeMark.attrs.id : uuidv4(); newTr.addMark(Math.max(step.from, pos), Math.min(step.to, pos + node.nodeSize), step.mark); - const allowedMarks = ['bold', 'italic', 'strike', 'underline', 'textStyle']; + const allowedMarks = ['bold', 'italic', 'strike', 'underline', 'textStyle', 'highlight']; // ![TrackDeleteMarkName].includes(step.mark.type.name) if (allowedMarks.includes(step.mark.type.name) && !hasMatchingMark(liveMarks, step.mark)) { diff --git a/packages/super-editor/src/extensions/track-changes/trackChangesHelpers/removeMarkStep.js b/packages/super-editor/src/extensions/track-changes/trackChangesHelpers/removeMarkStep.js index 1a90a694ac..0011e05edb 100644 --- a/packages/super-editor/src/extensions/track-changes/trackChangesHelpers/removeMarkStep.js +++ b/packages/super-editor/src/extensions/track-changes/trackChangesHelpers/removeMarkStep.js @@ -35,7 +35,7 @@ export const removeMarkStep = ({ state, step, newTr, doc, user, date }) => { }); newTr.removeMark(Math.max(step.from, pos), Math.min(step.to, pos + node.nodeSize), step.mark); - const allowedMarks = ['bold', 'italic', 'strike', 'underline', 'textStyle']; + const allowedMarks = ['bold', 'italic', 'strike', 'underline', 'textStyle', 'highlight']; if (allowedMarks.includes(step.mark.type.name) && hasMatchingMark(liveMarksBeforeRemove, step.mark)) { const formatChangeMark = liveMarksBeforeRemove.find((mark) => mark.type.name === TrackFormatMarkName); diff --git a/packages/super-editor/src/extensions/track-changes/trackChangesHelpers/trackChangesHelpers.test.js b/packages/super-editor/src/extensions/track-changes/trackChangesHelpers/trackChangesHelpers.test.js index 56baee61bd..170d1f9357 100644 --- a/packages/super-editor/src/extensions/track-changes/trackChangesHelpers/trackChangesHelpers.test.js +++ b/packages/super-editor/src/extensions/track-changes/trackChangesHelpers/trackChangesHelpers.test.js @@ -379,6 +379,26 @@ describe('trackChangesHelpers', () => { expect(meta?.formatMark?.attrs?.after).toEqual([{ type: 'textStyle', attrs: changedTextStyle.attrs }]); }); + it('addMarkStep tracks highlight mark changes', () => { + const state = createState(createDocWithText('Highlight me')); + const highlightMark = schema.marks.highlight.create({ color: '#E4668C' }); + const step = new AddMarkStep(1, 12, highlightMark); + const newTr = state.tr; + + addMarkStep({ + state, + step, + newTr, + doc: state.doc, + user, + date, + }); + + const meta = newTr.getMeta(TrackChangesBasePluginKey); + expect(meta?.formatMark?.type.name).toBe(TrackFormatMarkName); + expect(meta?.formatMark?.attrs?.after).toEqual([{ type: 'highlight', attrs: { color: '#E4668C' } }]); + }); + it('removeMarkStep records previous formatting when mark removed', () => { const bold = schema.marks.bold.create(); const doc = createDocWithText('Styled', [bold]); @@ -400,6 +420,27 @@ describe('trackChangesHelpers', () => { expect(meta?.formatMark?.type.name).toBe(TrackFormatMarkName); }); + it('removeMarkStep tracks removed highlight mark', () => { + const highlight = schema.marks.highlight.create({ color: '#E4668C' }); + const doc = createDocWithText('Styled', [highlight]); + const state = createState(doc); + const step = new RemoveMarkStep(1, 7, highlight); + const newTr = state.tr; + + removeMarkStep({ + state, + step, + newTr, + doc: state.doc, + user, + date, + }); + + const meta = newTr.getMeta(TrackChangesBasePluginKey); + expect(meta?.formatMark?.type.name).toBe(TrackFormatMarkName); + expect(meta?.formatMark?.attrs?.before).toEqual([{ type: 'highlight', attrs: { color: '#E4668C' } }]); + }); + it('getTrackChanges enumerates marks with optional filtering', () => { const insertMark = schema.marks[TrackInsertMarkName].create({ id: 'track-1',