Merge branch 'master' into table-improvements-2

This commit is contained in:
deanhannigan 2024-07-16 09:04:39 +01:00 committed by GitHub
commit 17026d888e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 196 additions and 79 deletions

View File

@ -1,5 +1,5 @@
<script> <script>
import { Select, Label, Checkbox, Input, Body } from "@budibase/bbui" import { Select, Label, Checkbox, Body } from "@budibase/bbui"
import { tables, viewsV2 } from "stores/builder" import { tables, viewsV2 } from "stores/builder"
import DrawerBindableInput from "components/common/bindings/DrawerBindableInput.svelte" import DrawerBindableInput from "components/common/bindings/DrawerBindableInput.svelte"
@ -46,19 +46,35 @@
{#if parameters.confirm} {#if parameters.confirm}
<Label small>Title</Label> <Label small>Title</Label>
<Input placeholder="Delete Row" bind:value={parameters.customTitleText} /> <DrawerBindableInput
placeholder="Prompt User"
value={parameters.customTitleText}
on:change={e => (parameters.customTitleText = e.detail)}
{bindings}
/>
<Label small>Text</Label> <Label small>Text</Label>
<Input <DrawerBindableInput
placeholder="Are you sure you want to delete?" placeholder="Are you sure you want to continue?"
bind:value={parameters.confirmText} value={parameters.confirmText}
on:change={e => (parameters.confirmText = e.detail)}
{bindings}
/> />
<Label small>Confirm Text</Label> <Label small>Confirm Text</Label>
<Input placeholder="Confirm" bind:value={parameters.confirmButtonText} /> <DrawerBindableInput
placeholder="Confirm"
value={parameters.confirmButtonText}
on:change={e => (parameters.confirmButtonText = e.detail)}
{bindings}
/>
<Label small>Cancel Text</Label> <Label small>Cancel Text</Label>
<Input placeholder="Cancel" bind:value={parameters.cancelButtonText} /> <DrawerBindableInput
placeholder="Cancel"
value={parameters.cancelButtonText}
on:change={e => (parameters.cancelButtonText = e.detail)}
{bindings}
/>
{/if} {/if}
</div> </div>
</div> </div>

View File

@ -1,11 +1,12 @@
<script> <script>
import { Select, Label, Body, Checkbox, Input } from "@budibase/bbui" import { Select, Label, Body, Checkbox } from "@budibase/bbui"
import { import {
selectedScreen, selectedScreen,
componentStore, componentStore,
tables, tables,
viewsV2, viewsV2,
} from "stores/builder" } from "stores/builder"
import DrawerBindableInput from "components/common/bindings/DrawerBindableInput.svelte"
import { getSchemaForDatasourcePlus } from "dataBinding" import { getSchemaForDatasourcePlus } from "dataBinding"
import SaveFields from "./SaveFields.svelte" import SaveFields from "./SaveFields.svelte"
import { getDatasourceLikeProviders } from "components/design/settings/controls/ButtonActionEditor/actions/utils" import { getDatasourceLikeProviders } from "components/design/settings/controls/ButtonActionEditor/actions/utils"
@ -73,22 +74,35 @@
{#if parameters.confirm} {#if parameters.confirm}
<Label small>Title</Label> <Label small>Title</Label>
<Input <DrawerBindableInput
placeholder="Duplicate Row" placeholder="Prompt User"
bind:value={parameters.customTitleText} value={parameters.customTitleText}
on:change={e => (parameters.customTitleText = e.detail)}
{bindings}
/> />
<Label small>Text</Label> <Label small>Text</Label>
<Input <DrawerBindableInput
placeholder="Are you sure you want to duplicate this row?" placeholder="Are you sure you want to continue?"
bind:value={parameters.confirmText} value={parameters.confirmText}
on:change={e => (parameters.confirmText = e.detail)}
{bindings}
/> />
<Label small>Confirm Text</Label> <Label small>Confirm Text</Label>
<Input placeholder="Confirm" bind:value={parameters.confirmButtonText} /> <DrawerBindableInput
placeholder="Confirm"
value={parameters.confirmButtonText}
on:change={e => (parameters.confirmButtonText = e.detail)}
{bindings}
/>
<Label small>Cancel Text</Label> <Label small>Cancel Text</Label>
<Input placeholder="Cancel" bind:value={parameters.cancelButtonText} /> <DrawerBindableInput
placeholder="Cancel"
value={parameters.cancelButtonText}
on:change={e => (parameters.cancelButtonText = e.detail)}
{bindings}
/>
{/if} {/if}
</div> </div>

View File

@ -1,5 +1,6 @@
<script> <script>
import { Select, Layout, Input, Checkbox } from "@budibase/bbui" import { Select, Layout, Checkbox } from "@budibase/bbui"
import DrawerBindableInput from "components/common/bindings/DrawerBindableInput.svelte"
import { datasources, integrations, queries } from "stores/builder" import { datasources, integrations, queries } from "stores/builder"
import BindingBuilder from "components/integration/QueryBindingBuilder.svelte" import BindingBuilder from "components/integration/QueryBindingBuilder.svelte"
import IntegrationQueryEditor from "components/integration/index.svelte" import IntegrationQueryEditor from "components/integration/index.svelte"
@ -58,37 +59,46 @@
text="Do not display default notification" text="Do not display default notification"
bind:value={parameters.notificationOverride} bind:value={parameters.notificationOverride}
/> />
<br />
{#if parameters.queryId} {#if parameters.queryId}
<Checkbox text="Require confirmation" bind:value={parameters.confirm} /> <Checkbox text="Require confirmation" bind:value={parameters.confirm} />
{#if parameters.confirm} {#if parameters.confirm}
<Input <div class="params">
<DrawerBindableInput
label="Title" label="Title"
placeholder="Execute Query" placeholder="Prompt User"
bind:value={parameters.customTitleText} value={parameters.customTitleText}
on:change={e => (parameters.customTitleText = e.detail)}
{bindings}
/>
<DrawerBindableInput
label="Message"
placeholder="Are you sure you want to continue?"
value={parameters.confirmText}
on:change={e => (parameters.confirmText = e.detail)}
{bindings}
/> />
<Input <DrawerBindableInput
label="Text"
placeholder="Are you sure you want to execute this query?"
bind:value={parameters.confirmText}
/>
<Input
label="Confirm Text" label="Confirm Text"
placeholder="Confirm" placeholder="Confirm"
bind:value={parameters.confirmButtonText} value={parameters.confirmButtonText}
on:change={e => (parameters.confirmButtonText = e.detail)}
{bindings}
/> />
<Input <DrawerBindableInput
label="Cancel Text" label="Cancel Text"
placeholder="Cancel" placeholder="Cancel"
bind:value={parameters.cancelButtonText} value={parameters.cancelButtonText}
on:change={e => (parameters.cancelButtonText = e.detail)}
{bindings}
/> />
</div>
{/if} {/if}
{#if query?.parameters?.length > 0} {#if query?.parameters?.length > 0}
<br />
<div class="params"> <div class="params">
<BindingBuilder <BindingBuilder
customParams={parameters.queryParams} customParams={parameters.queryParams}

View File

@ -1,11 +1,12 @@
<script> <script>
import { Select, Label, Body, Checkbox, Input } from "@budibase/bbui" import { Select, Label, Body, Checkbox } from "@budibase/bbui"
import { import {
selectedScreen, selectedScreen,
componentStore, componentStore,
tables, tables,
viewsV2, viewsV2,
} from "stores/builder" } from "stores/builder"
import DrawerBindableInput from "components/common/bindings/DrawerBindableInput.svelte"
import { getSchemaForDatasourcePlus } from "dataBinding" import { getSchemaForDatasourcePlus } from "dataBinding"
import SaveFields from "./SaveFields.svelte" import SaveFields from "./SaveFields.svelte"
import { getDatasourceLikeProviders } from "components/design/settings/controls/ButtonActionEditor/actions/utils" import { getDatasourceLikeProviders } from "components/design/settings/controls/ButtonActionEditor/actions/utils"
@ -73,19 +74,35 @@
{#if parameters.confirm} {#if parameters.confirm}
<Label small>Title</Label> <Label small>Title</Label>
<Input placeholder="Save Row" bind:value={parameters.customTitleText} /> <DrawerBindableInput
placeholder="Prompt User"
value={parameters.customTitleText}
on:change={e => (parameters.customTitleText = e.detail)}
{bindings}
/>
<Label small>Text</Label> <Label small>Text</Label>
<Input <DrawerBindableInput
placeholder="Are you sure you want to save this row?" placeholder="Are you sure you want to continue?"
bind:value={parameters.confirmText} value={parameters.confirmText}
on:change={e => (parameters.confirmText = e.detail)}
{bindings}
/> />
<Label small>Confirm Text</Label> <Label small>Confirm Text</Label>
<Input placeholder="Confirm" bind:value={parameters.confirmButtonText} /> <DrawerBindableInput
placeholder="Confirm"
value={parameters.confirmButtonText}
on:change={e => (parameters.confirmButtonText = e.detail)}
{bindings}
/>
<Label small>Cancel Text</Label> <Label small>Cancel Text</Label>
<Input placeholder="Cancel" bind:value={parameters.cancelButtonText} /> <DrawerBindableInput
placeholder="Cancel"
value={parameters.cancelButtonText}
on:change={e => (parameters.cancelButtonText = e.detail)}
{bindings}
/>
{/if} {/if}
</div> </div>

View File

@ -124,7 +124,7 @@
<PropertyControl <PropertyControl
label="Text align" label="Text align"
control={BarButtonList} control={BarButtonList}
onChange={align => nav.syncAppNavigation({ textAlign: align })} onChange={align => update("textAlign", align)}
value={$nav.textAlign} value={$nav.textAlign}
props={{ props={{
options: alignmentOptions, options: alignmentOptions,

View File

@ -4,7 +4,12 @@ import {
getDatasource, getDatasource,
knexClient, knexClient,
} from "../../../integrations/tests/utils" } from "../../../integrations/tests/utils"
import { db as dbCore, utils } from "@budibase/backend-core" import {
db as dbCore,
MAX_VALID_DATE,
MIN_VALID_DATE,
utils,
} from "@budibase/backend-core"
import * as setup from "./utilities" import * as setup from "./utilities"
import { import {
@ -1098,19 +1103,35 @@ describe.each([
}).toFindNothing() }).toFindNothing()
}) })
// We never implemented half-open ranges in Lucene. it("greater than equal to", async () => {
!isLucene &&
it("can search using just a low value", async () => {
await expectQuery({ await expectQuery({
range: { age: { low: 5 } }, range: {
age: { low: 10, high: Number.MAX_SAFE_INTEGER },
},
}).toContainExactly([{ age: 10 }]) }).toContainExactly([{ age: 10 }])
}) })
// We never implemented half-open ranges in Lucene. it("greater than", async () => {
!isLucene &&
it("can search using just a high value", async () => {
await expectQuery({ await expectQuery({
range: { age: { high: 5 } }, range: {
age: { low: 5, high: Number.MAX_SAFE_INTEGER },
},
}).toContainExactly([{ age: 10 }])
})
it("less than equal to", async () => {
await expectQuery({
range: {
age: { high: 1, low: Number.MIN_SAFE_INTEGER },
},
}).toContainExactly([{ age: 1 }])
})
it("less than", async () => {
await expectQuery({
range: {
age: { high: 5, low: Number.MIN_SAFE_INTEGER },
},
}).toContainExactly([{ age: 1 }]) }).toContainExactly([{ age: 1 }])
}) })
}) })
@ -1232,19 +1253,27 @@ describe.each([
}).toFindNothing() }).toFindNothing()
}) })
// We never implemented half-open ranges in Lucene. it("greater than equal to", async () => {
!isLucene &&
it("can search using just a low value", async () => {
await expectQuery({ await expectQuery({
range: { dob: { low: JAN_5TH } }, range: { dob: { low: JAN_10TH, high: MAX_VALID_DATE.toISOString() } },
}).toContainExactly([{ dob: JAN_10TH }]) }).toContainExactly([{ dob: JAN_10TH }])
}) })
// We never implemented half-open ranges in Lucene. it("greater than", async () => {
!isLucene &&
it("can search using just a high value", async () => {
await expectQuery({ await expectQuery({
range: { dob: { high: JAN_5TH } }, range: { dob: { low: JAN_5TH, high: MAX_VALID_DATE.toISOString() } },
}).toContainExactly([{ dob: JAN_10TH }])
})
it("less than equal to", async () => {
await expectQuery({
range: { dob: { high: JAN_1ST, low: MIN_VALID_DATE.toISOString() } },
}).toContainExactly([{ dob: JAN_1ST }])
})
it("less than", async () => {
await expectQuery({
range: { dob: { high: JAN_5TH, low: MIN_VALID_DATE.toISOString() } },
}).toContainExactly([{ dob: JAN_1ST }]) }).toContainExactly([{ dob: JAN_1ST }])
}) })
}) })

View File

@ -0,0 +1,31 @@
const nodemailer = require("nodemailer")
const options = {
port: 587,
host: "smtp.ethereal.email",
secure: false,
auth: {
user: "seamus99@ethereal.email",
pass: "5ghVteZAqj6jkKJF9R",
},
}
const transporter = nodemailer.createTransport(options)
transporter.verify(function (error) {
if (error) {
console.log(error)
} else {
console.log("Ethereal server is ready to take our messages")
}
})
const message = {
from: "from@example.com",
to: "to@example.com",
subject: "Did this email arrive?",
html: "Hello World!",
}
transporter.sendMail(message).then(response => {
console.log("Test email URL: " + nodemailer.getTestMessageUrl(response))
})