From 2248b9f38710b180ffe061cdd998dbe46da2f200 Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Mon, 26 Jan 2026 09:38:31 +0000 Subject: [PATCH 1/4] Fix adding Bard sets --- resources/js/components/fieldtypes/bard/BardFieldtype.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/js/components/fieldtypes/bard/BardFieldtype.vue b/resources/js/components/fieldtypes/bard/BardFieldtype.vue index 8fac6b5479f..6f5ef62fc15 100644 --- a/resources/js/components/fieldtypes/bard/BardFieldtype.vue +++ b/resources/js/components/fieldtypes/bard/BardFieldtype.vue @@ -492,12 +492,12 @@ export default { this.loadingSet = handle; this.fetchSet(handle) - .then(data => this._addSet(handle, index, data)) + .then(data => this._addSet(handle, data)) .catch(() => this.$toast.error(__('Something went wrong'))) .finally(() => this.loadingSet = null); }, - _addSet(handle, index, data) { + _addSet(handle, data) { const id = uniqid(); const deepCopy = JSON.parse(JSON.stringify(data.defaults)); const values = Object.assign({}, { type: handle }, deepCopy); From c16f08b825473f2c90c5034cc6aa64a36967e2c6 Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Mon, 26 Jan 2026 11:44:45 +0000 Subject: [PATCH 2/4] Fix adding sets to Bard fields nested in Replicators When the parent set is a replicator set, we need to get `.type` instead of `.attrs.value.type`. --- resources/js/components/fieldtypes/bard/BardFieldtype.vue | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/resources/js/components/fieldtypes/bard/BardFieldtype.vue b/resources/js/components/fieldtypes/bard/BardFieldtype.vue index 6f5ef62fc15..bfd01c56fa9 100644 --- a/resources/js/components/fieldtypes/bard/BardFieldtype.vue +++ b/resources/js/components/fieldtypes/bard/BardFieldtype.vue @@ -551,7 +551,9 @@ export default { return this.fieldPathKeys .map((key, index) => { if (Number.isInteger(parseInt(key))) { - return data_get(this.publishContainer.values, this.fieldPathKeys.slice(0, index + 1).join('.'))?.attrs?.values.type; + let setValues = data_get(this.publishContainer.values, this.fieldPathKeys.slice(0, index + 1).join('.')); + + return setValues.attrs?.values.type || setValues.type; } return key; From 79c78a0b2aaca457abdd309eb4b6ee469028bf49 Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Mon, 26 Jan 2026 11:46:03 +0000 Subject: [PATCH 3/4] Fix adding sets to Replicator fields nested in Bards --- resources/js/components/fieldtypes/replicator/Replicator.vue | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/resources/js/components/fieldtypes/replicator/Replicator.vue b/resources/js/components/fieldtypes/replicator/Replicator.vue index 49b6f1af3a4..39fdd154516 100644 --- a/resources/js/components/fieldtypes/replicator/Replicator.vue +++ b/resources/js/components/fieldtypes/replicator/Replicator.vue @@ -266,7 +266,9 @@ export default { return this.fieldPathKeys .map((key, index) => { if (Number.isInteger(parseInt(key))) { - return data_get(this.publishContainer.values, this.fieldPathKeys.slice(0, index + 1).join('.'))?.type; + let setValues = data_get(this.publishContainer.values, this.fieldPathKeys.slice(0, index + 1).join('.')); + + return setValues.attrs?.values.type || setValues.type; } return key; From f3dea60152cc13776fad2510bd2479530782236c Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Mon, 26 Jan 2026 12:02:48 +0000 Subject: [PATCH 4/4] Fix pasting Bard sets --- .../fieldtypes/bard/BardFieldtype.vue | 9 +++- .../js/components/fieldtypes/bard/Set.js | 44 +++++++++++++------ 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/resources/js/components/fieldtypes/bard/BardFieldtype.vue b/resources/js/components/fieldtypes/bard/BardFieldtype.vue index bfd01c56fa9..6c470c009ed 100644 --- a/resources/js/components/fieldtypes/bard/BardFieldtype.vue +++ b/resources/js/components/fieldtypes/bard/BardFieldtype.vue @@ -582,13 +582,18 @@ export default { }); }, - pasteSet(attrs) { + async pasteSet(attrs) { const old_id = attrs.id; const id = uniqid(); const enabled = attrs.enabled; const values = Object.assign({}, attrs.values); - this.updateSetMeta(id, this.meta.existing[old_id] || this.meta.defaults[values.type] || {}); + if (this.meta.existing[old_id]) { + this.updateSetMeta(id, this.meta.existing[old_id]); + } else { + const data = await this.fetchSet(values.type); + this.updateSetMeta(id, data.new); + } return { id, enabled, values }; }, diff --git a/resources/js/components/fieldtypes/bard/Set.js b/resources/js/components/fieldtypes/bard/Set.js index a9f43523411..149f2bdd46f 100644 --- a/resources/js/components/fieldtypes/bard/Set.js +++ b/resources/js/components/fieldtypes/bard/Set.js @@ -106,20 +106,36 @@ export const Set = Node.create({ new Plugin({ key: new PluginKey('setPastedTransformer'), props: { - transformPasted: (slice) => { - const { content } = slice.content; - return new Slice( - Fragment.fromArray( - content.map((node) => { - if (node.type === type) { - return node.type.create(bard.pasteSet(node.attrs)); - } - return node.copy(node.content); - }), - ), - slice.openStart, - slice.openEnd, - ); + handlePaste: (view, event, slice) => { + let hasSetNodes = false; + slice.content.forEach((node) => { + if (node.type === type) hasSetNodes = true; + }); + + if (!hasSetNodes) return false; + + (async () => { + const content = []; + for (const node of slice.content.content) { + if (node.type === type) { + const newAttrs = await bard.pasteSet(node.attrs); + content.push(node.type.create(newAttrs)); + } else { + content.push(node); + } + } + + const newSlice = new Slice( + Fragment.fromArray(content), + slice.openStart, + slice.openEnd, + ); + + const tr = view.state.tr.replaceSelection(newSlice); + view.dispatch(tr); + })(); + + return true; }, }, }),