diff --git a/packages/builder/src/components/backend/TableNavigator/popovers/EditTablePopover.svelte b/packages/builder/src/components/backend/TableNavigator/popovers/EditTablePopover.svelte
index c2cda1f2d8..f2c726c8bf 100644
--- a/packages/builder/src/components/backend/TableNavigator/popovers/EditTablePopover.svelte
+++ b/packages/builder/src/components/backend/TableNavigator/popovers/EditTablePopover.svelte
@@ -28,7 +28,6 @@
let deleteTableName
$: externalTable = table?.sourceType === DB_TYPE_EXTERNAL
- $: allowDeletion = !externalTable || table?.created
function showDeleteModal() {
templateScreens = $screenStore.screens.filter(
@@ -56,7 +55,7 @@
$goto(`./datasource/${table.datasourceId}`)
}
} catch (error) {
- notifications.error("Error deleting table")
+ notifications.error(`Error deleting table - ${error.message}`)
}
}
@@ -86,17 +85,15 @@
}
-{#if allowDeletion}
-
-
-
-
- {#if !externalTable}
-
- {/if}
-
-
-{/if}
+
+
+
+
+ {#if !externalTable}
+
+ {/if}
+
+
import { getContext } from "svelte"
+ import { get } from "svelte/store"
import { generate } from "shortid"
import Block from "components/Block.svelte"
import BlockComponent from "components/BlockComponent.svelte"
@@ -33,8 +34,9 @@
export let sidePanelDeleteLabel
export let notificationOverride
- const { fetchDatasourceSchema, API } = getContext("sdk")
+ const { fetchDatasourceSchema, API, generateGoldenSample } = getContext("sdk")
const component = getContext("component")
+ const context = getContext("context")
const stateKey = `ID_${generate()}`
let formId
@@ -48,20 +50,6 @@
let schemaLoaded = false
$: deleteLabel = setDeleteLabel(sidePanelDeleteLabel, sidePanelShowDelete)
-
- const setDeleteLabel = sidePanelDeleteLabel => {
- // Accommodate old config to ensure delete button does not reappear
- let labelText = sidePanelShowDelete === false ? "" : sidePanelDeleteLabel
-
- // Empty text is considered hidden.
- if (labelText?.trim() === "") {
- return ""
- }
-
- // Default to "Delete" if the value is unset
- return labelText || "Delete"
- }
-
$: isDSPlus = dataSource?.type === "table" || dataSource?.type === "viewV2"
$: fetchSchema(dataSource)
$: enrichSearchColumns(searchColumns, schema).then(
@@ -105,6 +93,30 @@
},
]
+ // Provide additional data context for live binding eval
+ export const getAdditionalDataContext = () => {
+ const rows = get(context)[dataProviderId]?.rows
+ const goldenRow = generateGoldenSample(rows)
+ return {
+ eventContext: {
+ row: goldenRow,
+ },
+ }
+ }
+
+ const setDeleteLabel = sidePanelDeleteLabel => {
+ // Accommodate old config to ensure delete button does not reappear
+ let labelText = sidePanelShowDelete === false ? "" : sidePanelDeleteLabel
+
+ // Empty text is considered hidden.
+ if (labelText?.trim() === "") {
+ return ""
+ }
+
+ // Default to "Delete" if the value is unset
+ return labelText || "Delete"
+ }
+
// Load the datasource schema so we can determine column types
const fetchSchema = async dataSource => {
if (dataSource?.type === "table") {
diff --git a/packages/frontend-core/src/components/grid/overlays/KeyboardManager.svelte b/packages/frontend-core/src/components/grid/overlays/KeyboardManager.svelte
index 5e3a035d89..ed09301bb9 100644
--- a/packages/frontend-core/src/components/grid/overlays/KeyboardManager.svelte
+++ b/packages/frontend-core/src/components/grid/overlays/KeyboardManager.svelte
@@ -40,16 +40,18 @@
}
}
+ // Handle certain key presses regardless of selection state
+ if (e.key === "Enter" && (e.ctrlKey || e.metaKey) && $config.canAddRows) {
+ e.preventDefault()
+ dispatch("add-row-inline")
+ return
+ }
+
// If nothing selected avoid processing further key presses
if (!$focusedCellId) {
if (e.key === "Tab" || e.key?.startsWith("Arrow")) {
e.preventDefault()
focusFirstCell()
- } else if (e.key === "Enter" && (e.ctrlKey || e.metaKey)) {
- if ($config.canAddRows) {
- e.preventDefault()
- dispatch("add-row-inline")
- }
} else if (e.key === "Delete" || e.key === "Backspace") {
if (Object.keys($selectedRows).length && $config.canDeleteRows) {
dispatch("request-bulk-delete")
diff --git a/packages/server/src/api/controllers/table/external.ts b/packages/server/src/api/controllers/table/external.ts
index c85b46a95c..7c036bec9d 100644
--- a/packages/server/src/api/controllers/table/external.ts
+++ b/packages/server/src/api/controllers/table/external.ts
@@ -61,9 +61,6 @@ export async function destroy(ctx: UserCtx) {
const tableToDelete: TableRequest = await sdk.tables.getTable(
ctx.params.tableId
)
- if (!tableToDelete || !tableToDelete.created) {
- ctx.throw(400, "Cannot delete tables which weren't created in Budibase.")
- }
const datasourceId = getDatasourceId(tableToDelete)
try {
const { datasource, table } = await sdk.tables.external.destroy(