2020-10-23 11:34:14 +02:00
|
|
|
<script>
|
2021-01-20 12:14:36 +01:00
|
|
|
import { getBindableProperties } from "builderStore/dataBinding"
|
|
|
|
import {
|
|
|
|
Button,
|
|
|
|
Icon,
|
|
|
|
DropdownMenu,
|
|
|
|
Spacer,
|
|
|
|
Heading,
|
|
|
|
Drawer,
|
|
|
|
} from "@budibase/bbui"
|
2020-10-23 11:34:14 +02:00
|
|
|
import { createEventDispatcher } from "svelte"
|
2020-12-07 16:27:46 +01:00
|
|
|
import { store, backendUiStore, currentAsset } from "builderStore"
|
2021-01-12 18:04:51 +01:00
|
|
|
import { notifier } from "builderStore/store/notifications"
|
2021-01-08 19:22:03 +01:00
|
|
|
import ParameterBuilder from "components/integration/QueryParameterBuilder.svelte"
|
2021-01-14 15:22:24 +01:00
|
|
|
import IntegrationQueryEditor from "components/integration/index.svelte"
|
2020-10-23 11:34:14 +02:00
|
|
|
|
|
|
|
const dispatch = createEventDispatcher()
|
|
|
|
let anchorRight, dropdownRight
|
2021-01-19 14:16:55 +01:00
|
|
|
let drawer
|
2020-10-23 11:34:14 +02:00
|
|
|
|
|
|
|
export let value = {}
|
|
|
|
|
2020-10-27 16:28:13 +01:00
|
|
|
$: tables = $backendUiStore.tables.map(m => ({
|
2020-10-23 11:34:14 +02:00
|
|
|
label: m.name,
|
|
|
|
tableId: m._id,
|
|
|
|
type: "table",
|
|
|
|
}))
|
|
|
|
$: views = $backendUiStore.tables.reduce((acc, cur) => {
|
|
|
|
let viewsArr = Object.entries(cur.views).map(([key, value]) => ({
|
|
|
|
label: key,
|
|
|
|
name: key,
|
|
|
|
...value,
|
|
|
|
type: "view",
|
|
|
|
}))
|
|
|
|
return [...acc, ...viewsArr]
|
|
|
|
}, [])
|
2021-01-27 18:29:30 +01:00
|
|
|
$: queries = $backendUiStore.queries
|
2021-02-02 18:28:11 +01:00
|
|
|
.filter(query => query.queryVerb === "read" || query.readable)
|
2021-01-27 18:29:30 +01:00
|
|
|
.map(query => ({
|
|
|
|
label: query.name,
|
|
|
|
name: query.name,
|
|
|
|
tableId: query._id,
|
|
|
|
...query,
|
|
|
|
schema: query.schema,
|
|
|
|
parameters: query.parameters,
|
|
|
|
type: "query",
|
|
|
|
}))
|
2021-01-14 16:39:50 +01:00
|
|
|
$: bindableProperties = getBindableProperties(
|
|
|
|
$currentAsset.props,
|
|
|
|
$store.selectedComponentId
|
|
|
|
)
|
2021-01-08 19:22:03 +01:00
|
|
|
$: queryBindableProperties = bindableProperties.map(property => ({
|
|
|
|
...property,
|
|
|
|
category: property.type === "instance" ? "Component" : "Table",
|
|
|
|
label: property.readableBinding,
|
2021-01-12 11:28:41 +01:00
|
|
|
path: property.readableBinding,
|
2021-01-08 19:22:03 +01:00
|
|
|
}))
|
2020-10-23 11:34:14 +02:00
|
|
|
$: links = bindableProperties
|
2020-10-28 20:32:46 +01:00
|
|
|
.filter(x => x.fieldSchema?.type === "link")
|
2020-11-25 10:50:51 +01:00
|
|
|
.map(property => {
|
|
|
|
return {
|
2021-01-14 16:39:50 +01:00
|
|
|
providerId: property.providerId,
|
2020-11-25 10:50:51 +01:00
|
|
|
label: property.readableBinding,
|
|
|
|
fieldName: property.fieldSchema.name,
|
|
|
|
tableId: property.fieldSchema.tableId,
|
|
|
|
type: "link",
|
2021-01-21 11:42:14 +01:00
|
|
|
// These properties will be enriched by the client library and provide
|
|
|
|
// details of the parent row of the relationship field, from context
|
|
|
|
rowId: `{{ ${property.providerId}._id }}`,
|
|
|
|
rowTableId: `{{ ${property.providerId}.tableId }}`,
|
2020-11-25 10:50:51 +01:00
|
|
|
}
|
|
|
|
})
|
2021-01-14 15:22:24 +01:00
|
|
|
|
|
|
|
function handleSelected(selected) {
|
|
|
|
dispatch("change", selected)
|
|
|
|
dropdownRight.hide()
|
|
|
|
}
|
|
|
|
|
|
|
|
function fetchDatasourceSchema(query) {
|
2021-01-15 14:42:55 +01:00
|
|
|
const source = $backendUiStore.datasources.find(
|
|
|
|
ds => ds._id === query.datasourceId
|
|
|
|
).source
|
2021-01-22 13:22:28 +01:00
|
|
|
return $backendUiStore.integrations[source].query[query.queryVerb]
|
2021-01-14 15:22:24 +01:00
|
|
|
}
|
2020-10-23 11:34:14 +02:00
|
|
|
</script>
|
|
|
|
|
|
|
|
<div
|
|
|
|
class="dropdownbutton"
|
|
|
|
bind:this={anchorRight}
|
|
|
|
on:click={dropdownRight.show}>
|
2021-01-21 11:42:14 +01:00
|
|
|
<span>{value?.label ? value.label : 'Choose option'}</span>
|
2020-10-23 11:34:14 +02:00
|
|
|
<Icon name="arrowdown" />
|
|
|
|
</div>
|
2021-01-21 11:42:14 +01:00
|
|
|
{#if value?.type === 'query'}
|
2021-01-19 14:16:55 +01:00
|
|
|
<i class="ri-settings-5-line" on:click={drawer.show} />
|
2021-01-21 11:42:14 +01:00
|
|
|
<Drawer title={'Query'} bind:this={drawer}>
|
2021-01-20 12:14:36 +01:00
|
|
|
<div slot="buttons">
|
|
|
|
<Button
|
|
|
|
blue
|
|
|
|
thin
|
|
|
|
on:click={() => {
|
|
|
|
notifier.success('Query parameters saved.')
|
|
|
|
handleSelected(value)
|
|
|
|
drawer.hide()
|
|
|
|
}}>
|
|
|
|
Save
|
|
|
|
</Button>
|
|
|
|
</div>
|
|
|
|
<div class="drawer-contents" slot="body">
|
|
|
|
<IntegrationQueryEditor
|
|
|
|
query={value}
|
|
|
|
schema={fetchDatasourceSchema(value)}
|
|
|
|
editable={false} />
|
|
|
|
<Spacer large />
|
|
|
|
{#if value.parameters.length > 0}
|
|
|
|
<ParameterBuilder
|
|
|
|
bind:customParams={value.queryParams}
|
|
|
|
parameters={queries.find(query => query._id === value._id).parameters}
|
|
|
|
bindings={queryBindableProperties} />
|
|
|
|
{/if}
|
|
|
|
</div>
|
|
|
|
</Drawer>
|
|
|
|
{/if}
|
2020-10-23 11:34:14 +02:00
|
|
|
<DropdownMenu bind:this={dropdownRight} anchor={anchorRight}>
|
|
|
|
<div class="dropdown">
|
|
|
|
<div class="title">
|
|
|
|
<Heading extraSmall>Tables</Heading>
|
|
|
|
</div>
|
|
|
|
<ul>
|
|
|
|
{#each tables as table}
|
|
|
|
<li
|
|
|
|
class:selected={value === table}
|
|
|
|
on:click={() => handleSelected(table)}>
|
|
|
|
{table.label}
|
|
|
|
</li>
|
|
|
|
{/each}
|
|
|
|
</ul>
|
|
|
|
<hr />
|
|
|
|
<div class="title">
|
|
|
|
<Heading extraSmall>Views</Heading>
|
|
|
|
</div>
|
|
|
|
<ul>
|
|
|
|
{#each views as view}
|
|
|
|
<li
|
|
|
|
class:selected={value === view}
|
|
|
|
on:click={() => handleSelected(view)}>
|
|
|
|
{view.label}
|
|
|
|
</li>
|
|
|
|
{/each}
|
|
|
|
</ul>
|
|
|
|
<hr />
|
|
|
|
<div class="title">
|
|
|
|
<Heading extraSmall>Relationships</Heading>
|
|
|
|
</div>
|
|
|
|
<ul>
|
|
|
|
{#each links as link}
|
|
|
|
<li
|
|
|
|
class:selected={value === link}
|
|
|
|
on:click={() => handleSelected(link)}>
|
|
|
|
{link.label}
|
|
|
|
</li>
|
|
|
|
{/each}
|
|
|
|
</ul>
|
2020-12-18 19:19:43 +01:00
|
|
|
|
|
|
|
<hr />
|
|
|
|
<div class="title">
|
|
|
|
<Heading extraSmall>Queries</Heading>
|
|
|
|
</div>
|
|
|
|
<ul>
|
|
|
|
{#each queries as query}
|
|
|
|
<li
|
|
|
|
class:selected={value === query}
|
|
|
|
on:click={() => handleSelected(query)}>
|
|
|
|
{query.label}
|
|
|
|
</li>
|
|
|
|
{/each}
|
|
|
|
</ul>
|
2020-10-23 11:34:14 +02:00
|
|
|
</div>
|
|
|
|
</DropdownMenu>
|
|
|
|
|
|
|
|
<style>
|
|
|
|
.dropdownbutton {
|
|
|
|
background-color: var(--grey-2);
|
|
|
|
border: var(--border-transparent);
|
|
|
|
padding: var(--spacing-s) var(--spacing-m);
|
|
|
|
border-radius: var(--border-radius-m);
|
|
|
|
display: flex;
|
|
|
|
flex-direction: row;
|
|
|
|
justify-content: space-between;
|
|
|
|
align-items: center;
|
|
|
|
overflow: hidden;
|
|
|
|
flex: 1 1 auto;
|
|
|
|
}
|
|
|
|
.dropdownbutton:hover {
|
|
|
|
cursor: pointer;
|
|
|
|
background-color: var(--grey-3);
|
|
|
|
}
|
|
|
|
.dropdownbutton span {
|
|
|
|
white-space: nowrap;
|
|
|
|
text-overflow: ellipsis;
|
|
|
|
overflow: hidden;
|
|
|
|
flex: 1 1 auto;
|
|
|
|
text-align: left;
|
|
|
|
font-size: var(--font-size-xs);
|
|
|
|
}
|
|
|
|
.dropdownbutton :global(svg) {
|
|
|
|
margin: -4px 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
.dropdown {
|
|
|
|
padding: var(--spacing-m) 0;
|
|
|
|
z-index: 99999999;
|
|
|
|
}
|
|
|
|
.title {
|
|
|
|
padding: 0 var(--spacing-m) var(--spacing-xs) var(--spacing-m);
|
|
|
|
}
|
|
|
|
|
|
|
|
hr {
|
|
|
|
margin: var(--spacing-m) 0 var(--spacing-xl) 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
ul {
|
|
|
|
list-style: none;
|
|
|
|
padding-left: 0px;
|
|
|
|
margin: 0px;
|
|
|
|
}
|
|
|
|
|
|
|
|
li {
|
|
|
|
cursor: pointer;
|
|
|
|
margin: 0px;
|
|
|
|
padding: var(--spacing-s) var(--spacing-m);
|
|
|
|
font-size: var(--font-size-xs);
|
|
|
|
}
|
|
|
|
|
|
|
|
.selected {
|
|
|
|
background-color: var(--grey-4);
|
|
|
|
}
|
|
|
|
|
|
|
|
li:hover {
|
|
|
|
background-color: var(--grey-4);
|
|
|
|
}
|
2021-01-08 19:22:03 +01:00
|
|
|
|
|
|
|
.drawer-contents {
|
|
|
|
padding: var(--spacing-xl);
|
2021-01-14 15:22:24 +01:00
|
|
|
height: 40vh;
|
|
|
|
overflow-y: auto;
|
2021-01-08 19:22:03 +01:00
|
|
|
}
|
2021-01-11 21:17:56 +01:00
|
|
|
|
|
|
|
i {
|
|
|
|
margin-left: 5px;
|
|
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
|
|
transition: all 0.2s;
|
|
|
|
}
|
|
|
|
|
|
|
|
i:hover {
|
|
|
|
transform: scale(1.1);
|
|
|
|
font-weight: 500;
|
|
|
|
cursor: pointer;
|
|
|
|
}
|
2020-10-23 11:34:14 +02:00
|
|
|
</style>
|