diff --git a/packages/builder/src/components/common/bindings/BindingSidePanel.svelte b/packages/builder/src/components/common/bindings/BindingSidePanel.svelte index b17eedd294..0b542a413b 100644 --- a/packages/builder/src/components/common/bindings/BindingSidePanel.svelte +++ b/packages/builder/src/components/common/bindings/BindingSidePanel.svelte @@ -7,7 +7,8 @@ import { BindingMode } from "@budibase/types" import { EditorModes } from "../CodeEditor" import CodeEditor from "../CodeEditor/CodeEditor.svelte" - import SnippetDrawer from "./SnippetDrawer.svelte" + import SnippetsSidePanelHeader from "./snippets/SidePanelHeader.svelte" + import SnippetsSidePanelContent from "./snippets/SidePanelContent.svelte" export let addHelper: (_helper: Helper, _js?: boolean) => void export let addBinding: (_binding: EnrichedBinding) => void @@ -24,15 +25,13 @@ let popover: Popover let popoverAnchor: HTMLElement | null let hoverTarget: { - type: "binding" | "helper" | "snippet" + type: "binding" | "helper" code: string description?: string } | null let helpers = handlebarsCompletions() let selectedCategory: string | null let hideTimeout: ReturnType | null - let snippetDrawer: SnippetDrawer - let editableSnippet: Snippet | null $: bindingIcons = bindings?.reduce>((acc, ele) => { if (ele.icon) { @@ -47,13 +46,10 @@ } as Record $: categories = Object.entries(groupBy("category", bindings)) - $: filteredSnippets = getFilteredSnippets( - mode, - allowSnippets, - snippets || [], - search + $: categoryNames = getCategoryNames( + categories, + allowSnippets && mode === BindingMode.JavaScript ) - $: categoryNames = getCategoryNames(categories, filteredSnippets.length > 0) $: searchRgx = new RegExp(search, "ig") $: filteredCategories = categories .map(([name, categoryBindings]) => ({ @@ -82,26 +78,6 @@ } $: onModeChange(mode) - const getFilteredSnippets = ( - mode: BindingMode, - enableSnippets: boolean, - snippets: Snippet[], - search: string - ) => { - if (mode !== BindingMode.JavaScript) { - return [] - } - if (!enableSnippets || !snippets.length) { - return [] - } - if (!search?.length) { - return snippets - } - return snippets.filter(snippet => - snippet.name.toLowerCase().includes(search.toLowerCase()) - ) - } - const getHelperExample = (helper: Helper, js: boolean) => { let example = helper.example || "" if (js) { @@ -157,19 +133,6 @@ popover.show() } - const showSnippetPopover = (snippet: Snippet, target: HTMLElement) => { - stopHidingPopover() - if (!snippet.code) { - return - } - popoverAnchor = target - hoverTarget = { - type: "snippet", - code: snippet.code, - } - popover.show() - } - const hidePopover = () => { hideTimeout = setTimeout(() => { popover.hide() @@ -196,18 +159,6 @@ searching = false search = "" } - - const createSnippet = () => { - editableSnippet = null - snippetDrawer.show() - } - - const editSnippet = (e: Event, snippet: Snippet) => { - e.preventDefault() - e.stopPropagation() - editableSnippet = snippet - snippetDrawer.show() - } {#if popoverAnchor && hoverTarget} @@ -262,15 +213,8 @@ /> {selectedCategory} {#if selectedCategory === "Snippets"} -
- -
{/if} + + {/if} {/if} @@ -389,43 +333,12 @@ {/if} {#if selectedCategory === "Snippets" || search} - {#if filteredSnippets?.length} -
-
    - {#each filteredSnippets as snippet} -
  • - showSnippetPopover(snippet, e.currentTarget)} - on:mouseleave={hidePopover} - on:click={() => addSnippet(snippet)} - > - {snippet.name} - {#if search} - - snippet - - {:else} - editSnippet(e, snippet)} - /> - {/if} -
  • - {/each} -
-
- {/if} + {/if} {/if} - - diff --git a/packages/builder/src/components/common/bindings/snippets/SidePanelContent.svelte b/packages/builder/src/components/common/bindings/snippets/SidePanelContent.svelte new file mode 100644 index 0000000000..b83d9323b7 --- /dev/null +++ b/packages/builder/src/components/common/bindings/snippets/SidePanelContent.svelte @@ -0,0 +1,191 @@ + + + + +
+ {#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 hoverTarget && popoverAnchor} + +
+ {#key hoverTarget} + + {/key} +
+
+{/if} + + + + diff --git a/packages/builder/src/components/common/bindings/snippets/SidePanelHeader.svelte b/packages/builder/src/components/common/bindings/snippets/SidePanelHeader.svelte new file mode 100644 index 0000000000..b62282299b --- /dev/null +++ b/packages/builder/src/components/common/bindings/snippets/SidePanelHeader.svelte @@ -0,0 +1,46 @@ + + +{#if enableSnippets} +
+ +
+{:else} +
+ + Premium + +
+{/if} + + + +