diff --git a/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte b/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte
index f4fa762bce..b169cd2f7c 100644
--- a/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte
+++ b/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte
@@ -117,7 +117,7 @@
const indentWithTabCustom = {
key: "Tab",
run: view => {
- if (completionStatus(view.state) == "active") {
+ if (completionStatus(view.state) === "active") {
acceptCompletion(view)
return true
}
@@ -131,7 +131,7 @@
}
const buildKeymap = () => {
- const baseMap = [
+ return [
...closeBracketsKeymap,
...defaultKeymap,
...historyKeymap,
@@ -139,7 +139,6 @@
...completionKeymap,
indentWithTabCustom,
]
- return baseMap
}
const buildBaseExtensions = () => {
@@ -215,7 +214,7 @@
)
}
- if (mode.name == "javascript") {
+ if (mode.name === "javascript") {
complete.push(javascript())
complete.push(highlightWhitespace())
complete.push(lineNumbers())
@@ -321,4 +320,19 @@
border-radius: var(--border-radius-s);
padding: 4px 6px;
}
+
+ .code-editor :global(.binding__example) {
+ padding: 0;
+ margin: 0;
+ font-size: 12px;
+ white-space: pre;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ max-height: 480px;
+ }
+ .code-editor :global(.binding__example span) {
+ overflow: hidden !important;
+ text-overflow: ellipsis !important;
+ white-space: nowrap !important;
+ }
diff --git a/packages/builder/src/components/common/CodeEditor/index.js b/packages/builder/src/components/common/CodeEditor/index.js
index 0d71a475f0..6f55f42169 100644
--- a/packages/builder/src/components/common/CodeEditor/index.js
+++ b/packages/builder/src/components/common/CodeEditor/index.js
@@ -255,6 +255,11 @@ export const buildBindingInfoNode = (completion, binding) => {
const ele = document.createElement("div")
ele.classList.add("info-bubble")
+ if (binding.valueHTML) {
+ ele.innerHTML = `
${binding.valueHTML}
`
+ return ele
+ }
+
const exampleNodeHtml = binding.readableBinding
? `{{ ${binding.readableBinding} }}
`
: ""
diff --git a/packages/builder/src/components/common/bindings/BindingPanel.svelte b/packages/builder/src/components/common/bindings/BindingPanel.svelte
index f0ded4a67b..3708f83c61 100644
--- a/packages/builder/src/components/common/bindings/BindingPanel.svelte
+++ b/packages/builder/src/components/common/bindings/BindingPanel.svelte
@@ -62,16 +62,45 @@
let targetMode = null
let expressionResult
+ $: enrichedBindings = enrichBindings(bindings, context)
$: usingJS = mode === "JavaScript"
$: editorMode =
mode === "JavaScript" ? EditorModes.JS : EditorModes.Handlebars
- $: bindingCompletions = bindingsToCompletions(bindings, editorMode)
- $: runtimeExpression = readableToRuntimeBinding(bindings, value)
+ $: bindingCompletions = bindingsToCompletions(enrichedBindings, editorMode)
+ $: runtimeExpression = readableToRuntimeBinding(enrichedBindings, value)
$: expressionResult = processStringSync(runtimeExpression || "", context)
$: bindingHelpers = new BindingHelpers(getCaretPosition, insertAtPos)
+ const getBindingValue = (binding, context) => {
+ const hbs = `{{ literal ${binding.runtimeBinding} }}`
+ const res = processStringSync(hbs, context)
+ return JSON.stringify(res, null, 2)
+ }
+
+ const highlightJSON = json => {
+ return formatHighlight(json, {
+ keyColor: "#e06c75",
+ numberColor: "#e5c07b",
+ stringColor: "#98c379",
+ trueColor: "#d19a66",
+ falseColor: "#d19a66",
+ nullColor: "#c678dd",
+ })
+ }
+
+ const enrichBindings = (bindings, context) => {
+ return bindings.map(binding => {
+ const value = getBindingValue(binding, context)
+ return {
+ ...binding,
+ value,
+ valueHTML: highlightJSON(value),
+ }
+ })
+ }
+
const updateValue = val => {
- const runtimeExpression = readableToRuntimeBinding(bindings, val)
+ const runtimeExpression = readableToRuntimeBinding(enrichedBindings, val)
valid = isValid(runtimeExpression)
if (valid) {
dispatch("change", val)
@@ -116,9 +145,9 @@
}
const convert = () => {
- const runtime = readableToRuntimeBinding(bindings, hbsValue)
+ const runtime = readableToRuntimeBinding(enrichedBindings, hbsValue)
const runtimeJs = encodeJSBinding(convertToJS(runtime))
- jsValue = runtimeToReadableBinding(bindings, runtimeJs)
+ jsValue = runtimeToReadableBinding(enrichedBindings, runtimeJs)
hbsValue = null
mode = "JavaScript"
onSelectBinding("", { forceJS: true })
@@ -143,7 +172,7 @@
}
onMount(() => {
- valid = isValid(readableToRuntimeBinding(bindings, value))
+ valid = isValid(readableToRuntimeBinding(enrichedBindings, value))
})
@@ -261,7 +290,7 @@
{#if sidebar}
{
- const hbs = `{{ literal ${binding.runtimeBinding} }}`
- const res = processStringSync(hbs, context)
- return JSON.stringify(res, null, 2)
+ const showBindingPopover = (binding, target) => {
+ stopHidingPopover()
+ popoverAnchor = target
+ hoverTarget = {
+ code: binding.valueHTML,
+ }
+ popover.show()
}
- const highlight = json => {
- return formatHighlight(json, {
- keyColor: "#e06c75",
- numberColor: "#e5c07b",
- stringColor: "#98c379",
- trueColor: "#d19a66",
- falseColor: "#d19a66",
- nullColor: "#c678dd",
- })
- }
-
- const showPopover = (target, binding) => {
- if (hideTimeout) {
- clearTimeout(hideTimeout)
- hideTimeout = null
+ const showHelperPopover = (helper, target) => {
+ stopHidingPopover()
+ if (!helper.displayText && helper.description) {
+ return
}
- let val = getBindingValue(binding)
- if (val !== "") {
- popoverAnchor = target
- hoverTarget = {
- code: val,
- }
- popover.show()
+ popoverAnchor = target
+ hoverTarget = {
+ description: helper.description,
+ code: getHelperExample(helper, mode.name === "javascript"),
}
+ popover.show()
}
const hidePopover = () => {
@@ -112,7 +102,7 @@
}, 100)
}
- const stopHiding = () => {
+ const stopHidingPopover = () => {
if (hideTimeout) {
clearTimeout(hideTimeout)
hideTimeout = null
@@ -126,9 +116,10 @@
anchor={popoverAnchor}
minWidth={0}
maxWidth={480}
- maxHeight={300}
+ maxHeight={480}
dismissible={false}
- on:mouseenter={stopHiding}
+ on:mouseenter={stopHidingPopover}
+ on:mouseleave={hidePopover}
>
@@ -139,10 +130,8 @@
{/if}
{#if hoverTarget.code}
-
-
- {@html highlight(hoverTarget.code)}
-
+
+ {@html hoverTarget.code}
{/if}
@@ -212,10 +201,8 @@
{#each category.bindings as binding}
showPopover(e.target, binding)}
+ on:mouseenter={e => showBindingPopover(binding, e.target)}
on:mouseleave={hidePopover}
- on:focus={() => {}}
- on:blur={() => {}}
on:click={() => addBinding(binding)}
>
@@ -227,7 +214,6 @@
{binding.readableBinding}
{/if}
-
{#if binding.display?.type || binding.fieldSchema?.type}
@@ -250,26 +236,9 @@
{#each filteredHelpers as helper}
showHelperPopover(helper, e.target)}
+ on:mouseleave={hidePopover}
on:click={() => addHelper(helper, mode.name === "javascript")}
- on:mouseenter={e => {
- popoverAnchor = e.target
- if (!helper.displayText && helper.description) {
- return
- }
- hoverTarget = {
- description: helper.description,
- code: getHelperExample(helper, mode.name === "javascript"),
- }
- popover.show()
- e.stopPropagation()
- }}
- on:mouseleave={() => {
- popover.hide()
- popoverAnchor = null
- hoverTarget = null
- }}
- on:focus={() => {}}
- on:blur={() => {}}
>
{helper.displayText}
@@ -287,16 +256,16 @@