diff --git a/packages/bbui/src/Drawer/Drawer.svelte b/packages/bbui/src/Drawer/Drawer.svelte index 1f38389a63d..5650f5a812c 100644 --- a/packages/bbui/src/Drawer/Drawer.svelte +++ b/packages/bbui/src/Drawer/Drawer.svelte @@ -64,7 +64,7 @@ import { setContext, createEventDispatcher, onDestroy } from "svelte" import { generate } from "shortid" - export let title + export let title = "" export let forceModal = false const dispatch = createEventDispatcher() diff --git a/packages/bbui/src/Popover/Popover.svelte b/packages/bbui/src/Popover/Popover.svelte index 5d0c5b7039b..3e7e63814e6 100644 --- a/packages/bbui/src/Popover/Popover.svelte +++ b/packages/bbui/src/Popover/Popover.svelte @@ -18,7 +18,7 @@ import type { KeyboardEventHandler } from "svelte/elements" import { PopoverAlignment } from "../constants" - export let anchor: HTMLElement + export let anchor: HTMLElement | undefined export let align: PopoverAlignment | `${PopoverAlignment}` = PopoverAlignment.Right export let portalTarget: string | undefined = undefined diff --git a/packages/builder/src/components/common/bindings/BindingPanel.svelte b/packages/builder/src/components/common/bindings/BindingPanel.svelte index 1f611365003..3730a5466a4 100644 --- a/packages/builder/src/components/common/bindings/BindingPanel.svelte +++ b/packages/builder/src/components/common/bindings/BindingPanel.svelte @@ -27,12 +27,11 @@ } from "../CodeEditor" import BindingSidePanel from "./BindingSidePanel.svelte" import EvaluationSidePanel from "./EvaluationSidePanel.svelte" - import SnippetSidePanel from "./SnippetSidePanel.svelte" import { BindingHelpers } from "./utils" import { capitalise } from "@/helpers" import { Utils, JsonFormatter } from "@budibase/frontend-core" import { licensing } from "@/stores/portal" - import { BindingMode, SidePanel } from "@budibase/types" + import { BindingMode } from "@budibase/types" import type { EnrichedBinding, Snippet, @@ -44,6 +43,8 @@ import type { Log } from "@budibase/string-templates" import type { CodeValidator } from "@/types" + type SidePanel = "Bindings" | "Evaluation" + const dispatch = createEventDispatcher() export let bindings: EnrichedBinding[] = [] @@ -55,7 +56,7 @@ export let context = null export let snippets: Snippet[] | null = null export let autofocusEditor = false - export let placeholder = null + export let placeholder: string | null = null export let showTabBar = true let mode: BindingMode @@ -71,14 +72,13 @@ let expressionError: string | undefined let evaluating = false - $: useSnippets = allowSnippets && !$licensing.isFreePlan + const SidePanelIcons: Record = { + Bindings: "FlashOn", + Evaluation: "Play", + } + $: editorModeOptions = getModeOptions(allowHBS, allowJS) - $: sidePanelOptions = getSidePanelOptions( - bindings, - context, - allowSnippets, - mode - ) + $: sidePanelOptions = getSidePanelOptions(bindings, context) $: enrichedBindings = enrichBindings(bindings, context, snippets) $: usingJS = mode === BindingMode.JavaScript $: editorMode = @@ -93,7 +93,9 @@ $: bindingOptions = bindingsToCompletions(bindings, editorMode) $: helperOptions = allowHelpers ? getHelperCompletions(editorMode) : [] $: snippetsOptions = - usingJS && useSnippets && snippets?.length ? snippets : [] + usingJS && allowSnippets && !$licensing.isFreePlan && snippets?.length + ? snippets + : [] $: completions = !usingJS ? [hbAutocomplete([...bindingOptions, ...helperOptions])] @@ -137,21 +139,13 @@ return options } - const getSidePanelOptions = ( - bindings: EnrichedBinding[], - context: any, - useSnippets: boolean, - mode: BindingMode | null - ) => { - let options = [] + const getSidePanelOptions = (bindings: EnrichedBinding[], context: any) => { + let options: SidePanel[] = [] if (bindings?.length) { - options.push(SidePanel.Bindings) + options.push("Bindings") } if (context && Object.keys(context).length > 0) { - options.push(SidePanel.Evaluation) - } - if (useSnippets && mode === BindingMode.JavaScript) { - options.push(SidePanel.Snippets) + options.push("Evaluation") } return options } @@ -342,14 +336,15 @@ {/each}
- {#each sidePanelOptions as panel} + {#each sidePanelOptions as panelOption} changeSidePanel(panel)} + selected={sidePanel === panelOption} + on:click={() => changeSidePanel(panelOption)} + tooltip={panelOption} > - + {/each}
@@ -414,16 +409,19 @@
- {#if sidePanel === SidePanel.Bindings} + {#if sidePanel === "Bindings"} - {:else if sidePanel === SidePanel.Evaluation} + {:else if sidePanel === "Evaluation"} - {:else if sidePanel === SidePanel.Snippets} - {/if}
diff --git a/packages/builder/src/components/common/bindings/BindingSidePanel.svelte b/packages/builder/src/components/common/bindings/BindingSidePanel.svelte index 1b375db867a..865baacc292 100644 --- a/packages/builder/src/components/common/bindings/BindingSidePanel.svelte +++ b/packages/builder/src/components/common/bindings/BindingSidePanel.svelte @@ -1,31 +1,52 @@ -{#if popoverAnchor && hoverTarget} - -
+ + {#if hoverTarget} +
{#if hoverTarget.description}
@@ -158,12 +246,20 @@
{/if} {#if hoverTarget.code} - -
{@html hoverTarget.code}
+ {#if mode === BindingMode.JavaScript} + + {:else if mode === BindingMode.Text} + +
{@html hoverTarget.code}
+ {/if} {/if}
-
-{/if} + {/if} + @@ -178,6 +274,25 @@ on:click={() => (selectedCategory = null)} /> {selectedCategory} + {#if selectedCategory === "Snippets"} + {#if enableSnippets} +
+ +
+ {:else} +
+ + Premium + +
+ {/if} + {/if}
{/if} @@ -281,7 +396,6 @@ class="binding" on:mouseenter={e => showHelperPopover(helper, e.currentTarget)} - on:mouseleave={hidePopover} on:click={() => addHelper(helper, mode === BindingMode.JavaScript)} > @@ -295,10 +409,53 @@ {/if} {/if} + + {#if selectedCategory === "Snippets" || search} +
+ {#if enableSnippets} + {#each filteredSnippets as snippet} +
  • showSnippet(snippet, e.currentTarget)} + on:mouseleave={hidePopover} + on:click={() => addSnippet(snippet)} + > + {snippet.name} + editSnippet(e, snippet)} + /> +
  • + {/each} + {:else if !search} +
    + + Snippets let you create reusable JS functions and values that + can all be managed in one place + + {#if enableSnippets} + + {:else} + + {/if} +
    + {/if} +
    + {/if} {/if} +{#if showSnippetDrawer} + (showSnippetDrawer = false)} + /> +{/if} + diff --git a/packages/builder/src/components/common/bindings/SnippetDrawer.svelte b/packages/builder/src/components/common/bindings/SnippetDrawer.svelte index 4862217b135..86608d78539 100644 --- a/packages/builder/src/components/common/bindings/SnippetDrawer.svelte +++ b/packages/builder/src/components/common/bindings/SnippetDrawer.svelte @@ -1,4 +1,5 @@ - - + {#if snippet} {snippet.name} @@ -108,7 +113,11 @@ Delete {/if} - @@ -124,9 +133,7 @@ value={code} on:change={e => (code = e.detail)} > -
    - -
    + {/key} diff --git a/packages/builder/src/components/common/bindings/SnippetSidePanel.svelte b/packages/builder/src/components/common/bindings/SnippetSidePanel.svelte deleted file mode 100644 index 95f40005c0a..00000000000 --- a/packages/builder/src/components/common/bindings/SnippetSidePanel.svelte +++ /dev/null @@ -1,278 +0,0 @@ - - - - -
    - -
    - {#if enableSnippets} - {#if searching} -
    - -
    - - {:else} -
    Snippets
    - - - {/if} - {:else} -
    - Snippets - - Premium - -
    - {/if} -
    -
    - {#if enableSnippets && filteredSnippets?.length} - {#each filteredSnippets as snippet} -
    showSnippet(snippet, e.target)} - on:mouseleave={hidePopover} - on:click={() => addSnippet(snippet)} - > - {snippet.name} - editSnippet(e, snippet)} - /> -
    - {/each} - {:else} -
    - - Snippets let you create reusable JS functions and values that can - all be managed in one place - - {#if enableSnippets} - - {:else} - - {/if} -
    - {/if} -
    -
    -
    - - -
    - {#key hoveredSnippet} - - {/key} -
    -
    - - - - diff --git a/packages/builder/src/components/common/bindings/index.js b/packages/builder/src/components/common/bindings/index.js index a2d4479959a..5a9c6f661bc 100644 --- a/packages/builder/src/components/common/bindings/index.js +++ b/packages/builder/src/components/common/bindings/index.js @@ -8,5 +8,3 @@ export { default as DrawerBindableSlot } from "./DrawerBindableSlot.svelte" export { default as EvaluationSidePanel } from "./EvaluationSidePanel.svelte" export { default as ModalBindableInput } from "./ModalBindableInput.svelte" export { default as ServerBindingPanel } from "./ServerBindingPanel.svelte" -export { default as SnippetDrawer } from "./SnippetDrawer.svelte" -export { default as SnippetSidePanel } from "./SnippetSidePanel.svelte" diff --git a/packages/types/src/ui/components/index.ts b/packages/types/src/ui/components/index.ts index c34174120c9..b6bbdd6ed77 100644 --- a/packages/types/src/ui/components/index.ts +++ b/packages/types/src/ui/components/index.ts @@ -1,4 +1,3 @@ -export * from "./sidepanel" export * from "./codeEditor" export * from "./errors" diff --git a/packages/types/src/ui/components/sidepanel.ts b/packages/types/src/ui/components/sidepanel.ts deleted file mode 100644 index f2d62458d69..00000000000 --- a/packages/types/src/ui/components/sidepanel.ts +++ /dev/null @@ -1,5 +0,0 @@ -export enum SidePanel { - Bindings = "FlashOn", - Evaluation = "Play", - Snippets = "Code", -}