Moving drawers around to be a common component as they are utilised in a few places, keep all the binding work together, as well as some fixing for readable/runtime binding detection and conversion.

This commit is contained in:
mike12345567 2021-04-30 16:17:57 +01:00
parent 87e846054b
commit a6e282c19b
16 changed files with 79 additions and 49 deletions

View File

@ -340,8 +340,16 @@ function shouldReplaceBinding(currentValue, from, convertTo) {
if (convertTo === "readableBinding") { if (convertTo === "readableBinding") {
return true return true
} }
// remove all the spaces, if the input is surrounded by spaces e.g. [ Auto ID ] then
// this makes sure it is detected
const noSpaces = currentValue.replace(/\s+/g, "") const noSpaces = currentValue.replace(/\s+/g, "")
return !noSpaces.includes(`[${from}]`) const fromNoSpaces = from.replace(/\s+/g, "")
const invalids = [
`[${fromNoSpaces}]`,
`"${fromNoSpaces}"`,
`'${fromNoSpaces}'`,
]
return !invalids.find(invalid => noSpaces.includes(invalid))
} }
/** /**

View File

@ -5,8 +5,8 @@
import { Button, Input, Select, Label } from "@budibase/bbui" import { Button, Input, Select, Label } from "@budibase/bbui"
import { automationStore } from "builderStore" import { automationStore } from "builderStore"
import WebhookDisplay from "../Shared/WebhookDisplay.svelte" import WebhookDisplay from "../Shared/WebhookDisplay.svelte"
import DrawerBindableInput from "../../common/DrawerBindableInput.svelte" import DrawerBindableInput from "../../common/bindings/DrawerBindableInput.svelte"
import AutomationBindingPanel from "../../common/ServerBindingPanel.svelte" import AutomationBindingPanel from "../../common/bindings/ServerBindingPanel.svelte"
export let block export let block
export let webhookModal export let webhookModal

View File

@ -1,8 +1,8 @@
<script> <script>
import { tables } from "stores/backend" import { tables } from "stores/backend"
import { Select } from "@budibase/bbui" import { Select } from "@budibase/bbui"
import DrawerBindableInput from "../../common/DrawerBindableInput.svelte" import DrawerBindableInput from "../../common/bindings/DrawerBindableInput.svelte"
import AutomationBindingPanel from "../../common/ServerBindingPanel.svelte" import AutomationBindingPanel from "../../common/bindings/ServerBindingPanel.svelte"
export let value export let value
export let bindings export let bindings

View File

@ -23,7 +23,7 @@
import DatePicker from "components/common/DatePicker.svelte" import DatePicker from "components/common/DatePicker.svelte"
import ConfirmDialog from "components/common/ConfirmDialog.svelte" import ConfirmDialog from "components/common/ConfirmDialog.svelte"
import { truncate } from "lodash" import { truncate } from "lodash"
import ModalBindableInput from "components/common/ModalBindableInput.svelte" import ModalBindableInput from "components/common/bindings/ModalBindableInput.svelte"
import { getBindings } from "components/backend/DataTable/formula" import { getBindings } from "components/backend/DataTable/formula"
const AUTO_TYPE = "auto" const AUTO_TYPE = "auto"

View File

@ -9,6 +9,7 @@
} from "builderStore/dataBinding" } from "builderStore/dataBinding"
import { currentAsset, store } from "../../../builderStore" import { currentAsset, store } from "../../../builderStore"
import { handlebarsCompletions } from "constants/completions" import { handlebarsCompletions } from "constants/completions"
import { addToText } from "./utils"
const dispatch = createEventDispatcher() const dispatch = createEventDispatcher()
@ -37,20 +38,6 @@
valid = isValid(runtimeBinding) valid = isValid(runtimeBinding)
} }
function addToText(readableBinding) {
const position = getCaretPosition()
const toAdd = `{{ ${readableBinding} }}`
if (position.start) {
value =
value.substring(0, position.start) +
toAdd +
value.substring(position.end, value.length)
} else {
value = toAdd
}
}
export function cancel() { export function cancel() {
dispatch("update", originalValue) dispatch("update", originalValue)
bindingDrawer.close() bindingDrawer.close()
@ -69,7 +56,10 @@
{#each context.filter(context => {#each context.filter(context =>
context.readableBinding.match(searchRgx) context.readableBinding.match(searchRgx)
) as { readableBinding }} ) as { readableBinding }}
<li on:click={() => addToText(readableBinding)}> <li
on:click={() => {
value = addToText(value, getCaretPosition(), readableBinding)
}}>
{readableBinding} {readableBinding}
</li> </li>
{/each} {/each}
@ -83,7 +73,10 @@
{#each instance.filter(instance => {#each instance.filter(instance =>
instance.readableBinding.match(searchRgx) instance.readableBinding.match(searchRgx)
) as { readableBinding }} ) as { readableBinding }}
<li on:click={() => addToText(readableBinding)}> <li
on:click={() => {
value = addToText(value, getCaretPosition(), readableBinding)
}}>
{readableBinding} {readableBinding}
</li> </li>
{/each} {/each}
@ -94,7 +87,10 @@
<Spacer small /> <Spacer small />
<ul> <ul>
{#each helpers.filter(helper => helper.label.match(searchRgx) || helper.description.match(searchRgx)) as helper} {#each helpers.filter(helper => helper.label.match(searchRgx) || helper.description.match(searchRgx)) as helper}
<li on:click={() => addToText(helper.text)}> <li
on:click={() => {
value = addToText(value, getCaretPosition(), helper.text)
}}>
<div> <div>
<Label extraSmall>{helper.displayText}</Label> <Label extraSmall>{helper.displayText}</Label>
<div class="description"> <div class="description">
@ -152,7 +148,6 @@
} }
ul { ul {
list-style: none; list-style: none;
padding-left: 0;
margin: 0; margin: 0;
padding: 0; padding: 0;
} }

View File

@ -4,8 +4,8 @@
readableToRuntimeBinding, readableToRuntimeBinding,
runtimeToReadableBinding, runtimeToReadableBinding,
} from "builderStore/dataBinding" } from "builderStore/dataBinding"
import BindingPanel from "components/design/PropertiesPanel/BindingPanel.svelte" import BindingPanel from "components/common/bindings/BindingPanel.svelte"
import ServerBindingPanel from "components/common/ServerBindingPanel.svelte" import ServerBindingPanel from "components/common/bindings/ServerBindingPanel.svelte"
import { createEventDispatcher } from "svelte" import { createEventDispatcher } from "svelte"
const dispatch = createEventDispatcher() const dispatch = createEventDispatcher()

View File

@ -4,7 +4,7 @@
readableToRuntimeBinding, readableToRuntimeBinding,
runtimeToReadableBinding, runtimeToReadableBinding,
} from "builderStore/dataBinding" } from "builderStore/dataBinding"
import ServerBindingPanel from "components/common/ServerBindingPanel.svelte" import ServerBindingPanel from "components/common/bindings/ServerBindingPanel.svelte"
import { createEventDispatcher } from "svelte" import { createEventDispatcher } from "svelte"
const dispatch = createEventDispatcher() const dispatch = createEventDispatcher()

View File

@ -4,7 +4,8 @@
import { createEventDispatcher } from "svelte" import { createEventDispatcher } from "svelte"
import { isValid } from "@budibase/string-templates" import { isValid } from "@budibase/string-templates"
import { handlebarsCompletions } from "constants/completions" import { handlebarsCompletions } from "constants/completions"
import { readableToRuntimeBinding } from "../../builderStore/dataBinding" import { readableToRuntimeBinding } from "../../../builderStore/dataBinding"
import { addToText } from "./utils"
const dispatch = createEventDispatcher() const dispatch = createEventDispatcher()
@ -26,24 +27,14 @@
function checkValid() { function checkValid() {
if (hasReadable) { if (hasReadable) {
validity = isValid(readableToRuntimeBinding(bindableProperties, value)) const runtime = readableToRuntimeBinding(bindableProperties, value)
console.log(runtime)
validity = isValid(runtime)
} else { } else {
validity = isValid(value) validity = isValid(value)
} }
} }
function addToText(binding) {
const position = getCaretPosition()
const toAdd = `{{ ${binding.path} }}`
if (position.start) {
value =
value.substring(0, position.start) +
toAdd +
value.substring(position.end, value.length)
} else {
value += toAdd
}
}
export function cancel() { export function cancel() {
dispatch("update", originalValue) dispatch("update", originalValue)
if (bindingContainer && bindingContainer.close) { if (bindingContainer && bindingContainer.close) {
@ -64,7 +55,11 @@
{#each bindings.filter(binding => {#each bindings.filter(binding =>
binding.label.match(searchRgx) binding.label.match(searchRgx)
) as binding} ) as binding}
<div class="binding" on:click={() => addToText(binding)}> <div
class="binding"
on:click={() => {
value = addToText(value, getCaretPosition(), binding)
}}>
<span class="binding__label">{binding.label}</span> <span class="binding__label">{binding.label}</span>
<span class="binding__type">{binding.type}</span> <span class="binding__type">{binding.type}</span>
<br /> <br />
@ -77,7 +72,11 @@
<Heading extraSmall>Helpers</Heading> <Heading extraSmall>Helpers</Heading>
<Spacer extraSmall /> <Spacer extraSmall />
{#each helpers.filter(helper => helper.label.match(searchRgx) || helper.description.match(searchRgx)) as helper} {#each helpers.filter(helper => helper.label.match(searchRgx) || helper.description.match(searchRgx)) as helper}
<div class="binding" on:click={() => addToText(helper)}> <div
class="binding"
on:click={() => {
value = addToText(value, getCaretPosition(), helper)
}}>
<span class="binding__label">{helper.label}</span> <span class="binding__label">{helper.label}</span>
<br /> <br />
<div class="binding__description"> <div class="binding__description">

View File

@ -0,0 +1,15 @@
export function addToText(value, caretPos, binding) {
let toAdd = binding.path
if (!value.includes("{{") && !value.includes("}}")) {
toAdd = `{{ ${binding.path} }}`
}
if (caretPos.start) {
value =
value.substring(0, caretPos.start) +
toAdd +
value.substring(caretPos.end, value.length)
} else {
value += toAdd
}
return value
}

View File

@ -3,7 +3,7 @@
import { store, currentAsset } from "builderStore" import { store, currentAsset } from "builderStore"
import { tables } from "stores/backend" import { tables } from "stores/backend"
import { getBindableProperties } from "builderStore/dataBinding" import { getBindableProperties } from "builderStore/dataBinding"
import DrawerBindableInput from "components/common/DrawerBindableInput.svelte" import DrawerBindableInput from "components/common/bindings/DrawerBindableInput.svelte"
export let parameters export let parameters

View File

@ -2,7 +2,7 @@
import { Label } from "@budibase/bbui" import { Label } from "@budibase/bbui"
import { getBindableProperties } from "builderStore/dataBinding" import { getBindableProperties } from "builderStore/dataBinding"
import { currentAsset, store } from "builderStore" import { currentAsset, store } from "builderStore"
import DrawerBindableInput from "components/common/DrawerBindableInput.svelte" import DrawerBindableInput from "components/common/bindings/DrawerBindableInput.svelte"
export let parameters export let parameters

View File

@ -2,7 +2,7 @@
import { Label } from "@budibase/bbui" import { Label } from "@budibase/bbui"
import { getBindableProperties } from "builderStore/dataBinding" import { getBindableProperties } from "builderStore/dataBinding"
import { currentAsset, store } from "builderStore" import { currentAsset, store } from "builderStore"
import DrawerBindableInput from "components/common/DrawerBindableInput.svelte" import DrawerBindableInput from "components/common/bindings/DrawerBindableInput.svelte"
export let parameters export let parameters

View File

@ -4,7 +4,7 @@
import { getBindableProperties } from "builderStore/dataBinding" import { getBindableProperties } from "builderStore/dataBinding"
import { CloseCircleIcon, AddIcon } from "components/common/Icons" import { CloseCircleIcon, AddIcon } from "components/common/Icons"
import { createEventDispatcher } from "svelte" import { createEventDispatcher } from "svelte"
import DrawerBindableInput from "components/common/DrawerBindableInput.svelte" import DrawerBindableInput from "components/common/bindings/DrawerBindableInput.svelte"
const dispatch = createEventDispatcher() const dispatch = createEventDispatcher()

View File

@ -6,7 +6,7 @@
readableToRuntimeBinding, readableToRuntimeBinding,
runtimeToReadableBinding, runtimeToReadableBinding,
} from "builderStore/dataBinding" } from "builderStore/dataBinding"
import BindingPanel from "components/design/PropertiesPanel/BindingPanel.svelte" import BindingPanel from "components/common/bindings/BindingPanel.svelte"
import { capitalise } from "../../../../helpers" import { capitalise } from "../../../../helpers"
export let label = "" export let label = ""

View File

@ -4,7 +4,7 @@
readableToRuntimeBinding, readableToRuntimeBinding,
runtimeToReadableBinding, runtimeToReadableBinding,
} from "builderStore/dataBinding" } from "builderStore/dataBinding"
import DrawerBindableInput from "components/common/DrawerBindableInput.svelte" import DrawerBindableInput from "components/common/bindings/DrawerBindableInput.svelte"
export let bindable = true export let bindable = true
export let parameters = [] export let parameters = []

View File

@ -273,6 +273,19 @@ describe("test the comparison helpers", () => {
}) })
}) })
describe("Test the object/array helper", () => {
it("should allow plucking from an array of objects", async () => {
const context = {
items: [
{ price: 20 },
{ price: 30 },
]
}
const output = await processString("{{ sum ( pluck items 'price' ) }}", context)
expect(output).toBe(50)
})
})
describe("Test the literal helper", () => { describe("Test the literal helper", () => {
it("should allow use of the literal specifier for a number", async () => { it("should allow use of the literal specifier for a number", async () => {
const output = await processString(`{{literal a}}`, { const output = await processString(`{{literal a}}`, {