+
+
+
{#if tab === 'table'}
+
+
+
{:else if tab === 'datasource'}
+
+
+
{/if}
@@ -40,6 +57,7 @@
grid-template-columns: 260px minmax(0, 1fr);
background: var(--grey-2);
}
+
.content {
flex: 1 1 auto;
padding: var(--spacing-l) 40px;
@@ -50,6 +68,7 @@
align-items: stretch;
gap: var(--spacing-l);
}
+
.nav {
overflow-y: auto;
background: var(--background);
@@ -59,5 +78,18 @@
justify-content: flex-start;
align-items: stretch;
gap: var(--spacing-l);
+ position: relative;
+ }
+
+ i {
+ font-size: 20px;
+ position: absolute;
+ top: var(--spacing-l);
+ right: var(--spacing-xl);
+ }
+
+ i:hover {
+ cursor: pointer;
+ color: var(--blue);
}
diff --git a/packages/builder/src/pages/[application]/data/datasource/[selectedDatasource]/[query]/index.svelte b/packages/builder/src/pages/[application]/data/datasource/[selectedDatasource]/[query]/index.svelte
index 67acdc46f3..32c53a0c2d 100644
--- a/packages/builder/src/pages/[application]/data/datasource/[selectedDatasource]/[query]/index.svelte
+++ b/packages/builder/src/pages/[application]/data/datasource/[selectedDatasource]/[query]/index.svelte
@@ -10,6 +10,6 @@
$: query = datasource && datasource.queries[$params.query]
-{#if $backendUiStore.selectedDatabase._id && datasource}
-
+{#if $backendUiStore.selectedDatabase._id && datasource && query}
+
{/if}
diff --git a/packages/builder/src/pages/[application]/data/datasource/[selectedDatasource]/index.svelte b/packages/builder/src/pages/[application]/data/datasource/[selectedDatasource]/index.svelte
index e7be79ebf7..c2f615c511 100644
--- a/packages/builder/src/pages/[application]/data/datasource/[selectedDatasource]/index.svelte
+++ b/packages/builder/src/pages/[application]/data/datasource/[selectedDatasource]/index.svelte
@@ -36,7 +36,7 @@
margin-bottom: var(--spacing-s);
}
section {
- background: white;
+ background: var(--background);
border-radius: var(--border-radius-m);
padding: var(--spacing-xl);
}
diff --git a/packages/client/src/api/queries.js b/packages/client/src/api/queries.js
index 42177be4cf..cfc92262a0 100644
--- a/packages/client/src/api/queries.js
+++ b/packages/client/src/api/queries.js
@@ -9,3 +9,14 @@ export const fetchQueryData = async ({ datasourceId, queryId }) => {
})
return response.rows
}
+
+/**
+ * Executes a query against an external data connector.
+ */
+export const executeQuery = async ({ datasourceId, queryId }) => {
+ const response = await API.post({
+ url: `/api/datasources/${datasourceId}/queries/${queryId}`,
+ // body: params,
+ })
+ return response.rows
+}
diff --git a/packages/client/src/utils/buttonActions.js b/packages/client/src/utils/buttonActions.js
index 2968525188..f17e5d0ee5 100644
--- a/packages/client/src/utils/buttonActions.js
+++ b/packages/client/src/utils/buttonActions.js
@@ -1,6 +1,6 @@
-import { enrichDataBinding } from "./enrichDataBinding"
+import { enrichDataBinding, enrichDataBindings } from "./enrichDataBinding"
import { routeStore } from "../store"
-import { saveRow, deleteRow } from "../api"
+import { saveRow, deleteRow, executeQuery } from "../api"
const saveRowHandler = async (action, context) => {
let draft = context[`${action.parameters.contextPath}_draft`]
@@ -25,10 +25,27 @@ const navigationHandler = action => {
routeStore.actions.navigate(action.parameters.url)
}
+const queryExecutionHandler = async (action, context) => {
+ const { datasourceId, queryId, params } = action.parameters
+ console.log(context)
+ // TODO: allow context based bindings for query params
+ // const enrichedQueryParameters = enrichDataBindings(params, context)
+
+ // console.log({
+ // action,
+ // context,
+ // // enrichedQueryParameters,
+ // datasourceId,
+ // // queryId
+ // })
+ await executeQuery({ datasourceId, queryId })
+}
+
const handlerMap = {
["Save Row"]: saveRowHandler,
["Delete Row"]: deleteRowHandler,
["Navigate To"]: navigationHandler,
+ ["Execute Query"]: queryExecutionHandler,
}
/**
diff --git a/packages/server/src/api/controllers/datasource.js b/packages/server/src/api/controllers/datasource.js
index 0b7ff1119b..d2a963d89a 100644
--- a/packages/server/src/api/controllers/datasource.js
+++ b/packages/server/src/api/controllers/datasource.js
@@ -115,7 +115,7 @@ exports.previewQuery = async function(ctx) {
ctx.body = await new Integration(config, query).query()
}
-exports.executeQuery = async function(ctx) {
+exports.fetchQuery = async function(ctx) {
const db = new CouchDB(ctx.user.appId)
const datasource = await db.get(ctx.params.datasourceId)
@@ -139,3 +139,28 @@ exports.executeQuery = async function(ctx) {
rows,
}
}
+
+exports.executeQuery = async function(ctx) {
+ const db = new CouchDB(ctx.user.appId)
+
+ const datasource = await db.get(ctx.params.datasourceId)
+
+ const query = datasource.queries[ctx.params.queryId]
+
+ const Integration = integrations[datasource.source]
+
+ if (!Integration) {
+ ctx.throw(400, "Integration type does not exist.")
+ return
+ }
+
+ // TODO: allow the ability to POST parameters down when executing the query
+ // const customParams = ctx.request.body
+
+ const response = await new Integration(
+ datasource.config,
+ query.queryString
+ ).query()
+
+ ctx.body = response
+}
diff --git a/packages/server/src/api/routes/datasource.js b/packages/server/src/api/routes/datasource.js
index b56d3bec84..19930e6f48 100644
--- a/packages/server/src/api/routes/datasource.js
+++ b/packages/server/src/api/routes/datasource.js
@@ -28,6 +28,11 @@ router
datasourceController.previewQuery
)
.get(
+ "/api/datasources/:datasourceId/queries/:queryId",
+ authorized(BUILDER),
+ datasourceController.fetchQuery
+ )
+ .post(
"/api/datasources/:datasourceId/queries/:queryId",
authorized(BUILDER),
datasourceController.executeQuery