diff --git a/resources/js/components/fieldtypes/bard/Set.js b/resources/js/components/fieldtypes/bard/Set.js index 907d5e58cd9..b410dd806fe 100644 --- a/resources/js/components/fieldtypes/bard/Set.js +++ b/resources/js/components/fieldtypes/bard/Set.js @@ -38,7 +38,7 @@ export const Set = Node.create({ return [ { tag: 'bard-set', - getAttrs: (dom) => JSON.parse(dom.innerHTML), + getAttrs: (dom) => JSON.parse(dom.textContent), }, ]; }, diff --git a/resources/js/tests/components/fieldtypes/bard/Set.test.js b/resources/js/tests/components/fieldtypes/bard/Set.test.js index 8da0092384d..223d55c01a9 100644 --- a/resources/js/tests/components/fieldtypes/bard/Set.test.js +++ b/resources/js/tests/components/fieldtypes/bard/Set.test.js @@ -2,6 +2,7 @@ import { mount } from '@vue/test-utils'; import { afterEach, expect, test, vi } from 'vitest'; import * as Globals from '@/bootstrap/globals'; import Set from '@/components/fieldtypes/bard/Set.vue'; +import { Set as SetNode } from '@/components/fieldtypes/bard/Set.js'; import { containerContextKey } from '@/components/ui/Publish/Container.vue'; Object.keys(Globals).forEach((fn) => (window[fn] = Globals[fn])); @@ -108,3 +109,14 @@ test('clicking a custom select field does not bubble its mousedown to ProseMirro expect(mousedown).not.toHaveBeenCalled(); }); + +test('pasting a copied set keeps html characters in its values', () => { + const attrs = { id: 'set-1', enabled: true, values: { type: 'my_set', code: 'bold & co' } }; + + // A copied set is rendered with the JSON as text, so the clipboard html has it entity-encoded. + const [tag, , json] = SetNode.config.renderHTML({ HTMLAttributes: attrs }); + const element = document.createElement(tag); + element.textContent = json; + + expect(SetNode.config.parseHTML()[0].getAttrs(element)).toEqual(attrs); +});