From fbbdb87548fa0e2d163fc5ad39367af54a13b4cc Mon Sep 17 00:00:00 2001 From: Jos de Jong Date: Fri, 20 Jan 2023 15:59:45 +0100 Subject: [PATCH] feat: add more context information to `onRenderMenu`: `mode` and `modal` BREAKING CHANGE: Callback changed from `onRenderMenu(mode, items)` to `onRenderMenu(items, { mode, modal })`. --- README.md | 4 ++-- src/lib/components/JSONEditor.svelte | 1 + src/lib/components/modals/JSONEditorModal.svelte | 1 + src/lib/components/modes/JSONEditorRoot.svelte | 7 +++++-- src/lib/components/modes/tablemode/TableMode.svelte | 4 ++-- .../components/modes/tablemode/menu/TableMenu.svelte | 6 +++--- src/lib/components/modes/textmode/TextMode.svelte | 4 ++-- src/lib/components/modes/textmode/menu/TextMenu.svelte | 7 +++---- src/lib/components/modes/treemode/TreeMode.svelte | 4 ++-- src/lib/components/modes/treemode/menu/TreeMenu.svelte | 6 +++--- src/lib/plugins/value/components/EnumValue.svelte | 3 ++- src/lib/types.ts | 10 ++++++---- src/routes/components/ReadonlyPassword.svelte | 8 +------- src/routes/development/+page.svelte | 7 +++++-- src/routes/examples/custom_menu_buttons/+page.svelte | 4 +++- src/routes/examples/custom_value_renderer/+page.svelte | 5 ++--- 16 files changed, 43 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index 40e08e0f..36e478b3 100644 --- a/README.md +++ b/README.md @@ -268,10 +268,10 @@ const editor = new JSONEditor({ } ``` -- `onRenderMenu(mode: 'tree' | 'text' | 'table', items: MenuItem[]) : MenuItem[] | undefined`. +- `onRenderMenu(items: MenuItem[], context: { mode: 'tree' | 'text' | 'table', modal: boolean }) : MenuItem[] | undefined`. Callback which can be used to make changes to the menu items. New items can be added, or existing items can be removed or reorganized. When the function - returns `undefined`, the original `items` will be applied. + returns `undefined`, the original `items` will be applied. Using the context values `mode` and `modal`, different actions can be taken depending on the mode of the editor and whether the editor is rendered inside a modal or not. A menu item `MenuItem` can be one of the following types: diff --git a/src/lib/components/JSONEditor.svelte b/src/lib/components/JSONEditor.svelte index 6ca8c20c..f367baf2 100644 --- a/src/lib/components/JSONEditor.svelte +++ b/src/lib/components/JSONEditor.svelte @@ -422,6 +422,7 @@ {validator} {validationParser} {pathParser} + insideModal={false} {onError} onChange={handleChange} onChangeMode={toggleMode} diff --git a/src/lib/components/modals/JSONEditorModal.svelte b/src/lib/components/modals/JSONEditorModal.svelte index afa629b7..9e356402 100644 --- a/src/lib/components/modals/JSONEditorModal.svelte +++ b/src/lib/components/modals/JSONEditorModal.svelte @@ -215,6 +215,7 @@ {validator} {validationParser} {pathParser} + insideModal={true} onError={handleError} onChange={handleChange} onChangeMode={handleChangeMode} diff --git a/src/lib/components/modes/JSONEditorRoot.svelte b/src/lib/components/modes/JSONEditorRoot.svelte index 75b5bca1..7ce06c63 100644 --- a/src/lib/components/modes/JSONEditorRoot.svelte +++ b/src/lib/components/modes/JSONEditorRoot.svelte @@ -16,6 +16,7 @@ OnFocus, OnJSONEditorModal, OnRenderMenu, + OnRenderMenuWithoutContext, OnRenderValue, OnSortModal, OnTransformModal, @@ -46,6 +47,7 @@ export let validator: Validator | null export let validationParser: JSONParser export let pathParser: JSONPathParser + export let insideModal: boolean export let onChange: OnChange export let onRenderValue: OnRenderValue @@ -95,12 +97,13 @@ separator: true } - $: handleRenderMenu = (mode: 'tree' | 'text' | 'table', items: MenuItem[]) => { + let handleRenderMenu: OnRenderMenuWithoutContext + $: handleRenderMenu = (items: MenuItem[]) => { const updatedItems = isMenuSpaceItem(items[0]) ? modeMenuItems.concat(items) // menu is empty, readOnly mode : modeMenuItems.concat(separatorMenuItem, items) - return onRenderMenu(mode, updatedItems) || updatedItems + return onRenderMenu(updatedItems, { mode, modal: insideModal }) || updatedItems } export function patch(operations: JSONPatchDocument): JSONPatchResult { diff --git a/src/lib/components/modes/tablemode/TableMode.svelte b/src/lib/components/modes/tablemode/TableMode.svelte index 01b6dd13..1a4987b7 100644 --- a/src/lib/components/modes/tablemode/TableMode.svelte +++ b/src/lib/components/modes/tablemode/TableMode.svelte @@ -18,7 +18,7 @@ OnChangeMode, OnFocus, OnJSONEditorModal, - OnRenderMenu, + OnRenderMenuWithoutContext, OnRenderValue, OnSortModal, OnTransformModal, @@ -144,7 +144,7 @@ export let onChange: OnChange export let onChangeMode: OnChangeMode export let onRenderValue: OnRenderValue - export let onRenderMenu: OnRenderMenu + export let onRenderMenu: OnRenderMenuWithoutContext export let onFocus: OnFocus export let onBlur: OnBlur export let onSortModal: OnSortModal diff --git a/src/lib/components/modes/tablemode/menu/TableMenu.svelte b/src/lib/components/modes/tablemode/menu/TableMenu.svelte index d266b086..031454c5 100644 --- a/src/lib/components/modes/tablemode/menu/TableMenu.svelte +++ b/src/lib/components/modes/tablemode/menu/TableMenu.svelte @@ -1,7 +1,7 @@ diff --git a/src/lib/components/modes/textmode/TextMode.svelte b/src/lib/components/modes/textmode/TextMode.svelte index 37a79650..c2f1a120 100644 --- a/src/lib/components/modes/textmode/TextMode.svelte +++ b/src/lib/components/modes/textmode/TextMode.svelte @@ -48,7 +48,7 @@ OnChangeMode, OnError, OnFocus, - OnRenderMenu, + OnRenderMenuWithoutContext, OnSortModal, OnTransformModal, ParseError, @@ -79,7 +79,7 @@ export let onError: OnError export let onFocus: OnFocus export let onBlur: OnBlur - export let onRenderMenu: OnRenderMenu + export let onRenderMenu: OnRenderMenuWithoutContext export let onSortModal: OnSortModal export let onTransformModal: OnTransformModal diff --git a/src/lib/components/modes/textmode/menu/TextMenu.svelte b/src/lib/components/modes/textmode/menu/TextMenu.svelte index a8579c8f..0cbdf2b6 100644 --- a/src/lib/components/modes/textmode/menu/TextMenu.svelte +++ b/src/lib/components/modes/textmode/menu/TextMenu.svelte @@ -10,8 +10,7 @@ } from '@fortawesome/free-solid-svg-icons' import { faJSONEditorCompact, faJSONEditorFormat } from '$lib/img/customFontawesomeIcons' import Menu from '../../../controls/Menu.svelte' - import { noop } from 'lodash-es' - import type { MenuItem } from '$lib' + import type { MenuItem, OnRenderMenuWithoutContext } from '$lib/types' export let readOnly = false export let onFormat @@ -27,7 +26,7 @@ export let canCompact export let canSort export let canTransform - export let onRenderMenu = noop + export let onRenderMenu: OnRenderMenuWithoutContext let defaultItems: MenuItem[] $: defaultItems = !readOnly @@ -103,7 +102,7 @@ } ] - $: items = onRenderMenu('text', defaultItems) || defaultItems + $: items = onRenderMenu(defaultItems) || defaultItems diff --git a/src/lib/components/modes/treemode/TreeMode.svelte b/src/lib/components/modes/treemode/TreeMode.svelte index 27551f93..9012a64f 100644 --- a/src/lib/components/modes/treemode/TreeMode.svelte +++ b/src/lib/components/modes/treemode/TreeMode.svelte @@ -119,7 +119,7 @@ OnExpand, OnFocus, OnJSONEditorModal, - OnRenderMenu, + OnRenderMenuWithoutContext, OnRenderValue, OnSortModal, OnTransformModal, @@ -173,7 +173,7 @@ export let onChange: OnChange export let onChangeMode: OnChangeMode export let onRenderValue: OnRenderValue - export let onRenderMenu: OnRenderMenu + export let onRenderMenu: OnRenderMenuWithoutContext export let onClassName: OnClassName | undefined export let onFocus: OnFocus export let onBlur: OnBlur diff --git a/src/lib/components/modes/treemode/menu/TreeMenu.svelte b/src/lib/components/modes/treemode/menu/TreeMenu.svelte index df4965de..2aac0bb4 100644 --- a/src/lib/components/modes/treemode/menu/TreeMenu.svelte +++ b/src/lib/components/modes/treemode/menu/TreeMenu.svelte @@ -14,7 +14,7 @@ import { faJSONEditorCollapse, faJSONEditorExpand } from '$lib/img/customFontawesomeIcons' import { isObjectOrArray } from '$lib/utils/typeUtils' import Menu from '../../../controls/Menu.svelte' - import type { JSONSelection, MenuItem, OnRenderMenu } from '$lib/types' + import type { JSONSelection, MenuItem, OnRenderMenuWithoutContext } from '$lib/types' import type { JSONValue } from 'immutable-json-patch' import { isKeySelection, isMultiSelection, isValueSelection } from '../../../../logic/selection' import type { HistoryState } from '../../../../logic/history' @@ -34,7 +34,7 @@ export let onTransform: () => void export let onContextMenu: () => void export let onCopy: () => void - export let onRenderMenu: OnRenderMenu + export let onRenderMenu: OnRenderMenuWithoutContext function handleToggleSearch() { showSearch = !showSearch @@ -154,7 +154,7 @@ } ] - $: items = onRenderMenu('tree', defaultItems) || defaultItems + $: items = onRenderMenu(defaultItems) || defaultItems diff --git a/src/lib/plugins/value/components/EnumValue.svelte b/src/lib/plugins/value/components/EnumValue.svelte index 0254614f..8a9885d2 100644 --- a/src/lib/plugins/value/components/EnumValue.svelte +++ b/src/lib/plugins/value/components/EnumValue.svelte @@ -5,6 +5,7 @@ import { compileJSONPointer } from 'immutable-json-patch' import { getValueClass } from '$lib/plugins/value/components/utils/getValueClass' import type { JSONParser, JSONSelection, OnPatch } from '../../../types' + import { isValueSelection } from '$lib/logic/selection' export let path: JSONPath export let value: JSONValue @@ -54,7 +55,7 @@