From da8fd6093de81daff47847cb1c50992b3f23fdbd Mon Sep 17 00:00:00 2001 From: Jos de Jong Date: Tue, 27 Feb 2024 13:53:42 +0100 Subject: [PATCH] fix: onCreateMenu and onCreateContextMenu possibly applying mutated changes without returning --- src/lib/components/modes/JSONEditorRoot.svelte | 9 +++++++-- src/routes/examples/custom_menu_buttons/+page.svelte | 9 +++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/lib/components/modes/JSONEditorRoot.svelte b/src/lib/components/modes/JSONEditorRoot.svelte index 65f376d3..410c5bc5 100644 --- a/src/lib/components/modes/JSONEditorRoot.svelte +++ b/src/lib/components/modes/JSONEditorRoot.svelte @@ -34,6 +34,7 @@ import TreeMode from './treemode/TreeMode.svelte' import type { JSONPatchDocument, JSONPath } from 'immutable-json-patch' import { isMenuSpace } from '$lib/typeguards.js' + import { cloneDeep } from 'lodash-es' export let content: Content export let selection: JSONEditorSelection | null @@ -112,12 +113,16 @@ ? modeMenuItems.concat(items) // menu is empty, readOnly mode : modeMenuItems.concat(separatorMenuItem, items) - return onRenderMenu(updatedItems, { mode, modal: insideModal }) || updatedItems + const updatedItemsOriginal = cloneDeep(updatedItems) // the user may change updatedItems in the callback + + return onRenderMenu(updatedItems, { mode, modal: insideModal }) || updatedItemsOriginal } let handleRenderContextMenu: OnRenderContextMenuInternal $: handleRenderContextMenu = (items: ContextMenuItem[]) => { - return onRenderContextMenu(items, { mode, modal: insideModal, selection }) || items + const itemsOriginal = cloneDeep(items) // the user may change items in the callback + + return onRenderContextMenu(items, { mode, modal: insideModal, selection }) || itemsOriginal } export function patch(operations: JSONPatchDocument): JSONPatchResult { diff --git a/src/routes/examples/custom_menu_buttons/+page.svelte b/src/routes/examples/custom_menu_buttons/+page.svelte index 60ae9642..88c15ea7 100644 --- a/src/routes/examples/custom_menu_buttons/+page.svelte +++ b/src/routes/examples/custom_menu_buttons/+page.svelte @@ -47,13 +47,10 @@ className: 'custom-copy-button' } - const space: MenuSpace = { - type: 'space' - } - - const itemsWithoutSpace = items.slice(0, items.length - 2) + const head = items.slice(0, items.length - 1) + const tail = items.slice(items.length - 1) // the tail contains space - return itemsWithoutSpace.concat([separator, customCopyButton, space]) + return head.concat(separator, customCopyButton, tail) }