Merge pull request #15413 from Budibase/BUDI-8986/align-tableselector-and-datasourceselector
Aligning the way that tableselector and datasourceselector display
This commit is contained in:
commit
5a023df0e0
|
@ -1,4 +1,5 @@
|
||||||
<script>
|
<script>
|
||||||
|
import { datasources } from "@/stores/builder"
|
||||||
import { Divider, Heading } from "@budibase/bbui"
|
import { Divider, Heading } from "@budibase/bbui"
|
||||||
|
|
||||||
export let dividerState
|
export let dividerState
|
||||||
|
@ -6,6 +7,8 @@
|
||||||
export let dataSet
|
export let dataSet
|
||||||
export let value
|
export let value
|
||||||
export let onSelect
|
export let onSelect
|
||||||
|
|
||||||
|
$: displayDatasourceName = $datasources.list.length > 1
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if dividerState}
|
{#if dividerState}
|
||||||
|
@ -21,7 +24,7 @@
|
||||||
{#each dataSet as data}
|
{#each dataSet as data}
|
||||||
<li
|
<li
|
||||||
class="spectrum-Menu-item"
|
class="spectrum-Menu-item"
|
||||||
class:is-selected={value?.label === data.label &&
|
class:is-selected={value?.resourceId === data.resourceId &&
|
||||||
value?.type === data.type}
|
value?.type === data.type}
|
||||||
role="option"
|
role="option"
|
||||||
aria-selected="true"
|
aria-selected="true"
|
||||||
|
@ -29,7 +32,9 @@
|
||||||
on:click={() => onSelect(data)}
|
on:click={() => onSelect(data)}
|
||||||
>
|
>
|
||||||
<span class="spectrum-Menu-itemLabel">
|
<span class="spectrum-Menu-itemLabel">
|
||||||
{data.datasourceName ? `${data.datasourceName} - ` : ""}{data.label}
|
{data.datasourceName && displayDatasourceName
|
||||||
|
? `${data.datasourceName} - `
|
||||||
|
: ""}{data.label}
|
||||||
</span>
|
</span>
|
||||||
<svg
|
<svg
|
||||||
class="spectrum-Icon spectrum-UIIcon-Checkmark100 spectrum-Menu-checkmark spectrum-Menu-itemIcon"
|
class="spectrum-Icon spectrum-UIIcon-Checkmark100 spectrum-Menu-checkmark spectrum-Menu-itemIcon"
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
import ClientBindingPanel from "@/components/common/bindings/ClientBindingPanel.svelte"
|
import ClientBindingPanel from "@/components/common/bindings/ClientBindingPanel.svelte"
|
||||||
import DataSourceCategory from "@/components/design/settings/controls/DataSourceSelect/DataSourceCategory.svelte"
|
import DataSourceCategory from "@/components/design/settings/controls/DataSourceSelect/DataSourceCategory.svelte"
|
||||||
import { API } from "@/api"
|
import { API } from "@/api"
|
||||||
import { datasourceSelect as format } from "@/helpers/data/format"
|
import { sortAndFormat } from "@/helpers/data/format"
|
||||||
|
|
||||||
export let value = {}
|
export let value = {}
|
||||||
export let otherSources
|
export let otherSources
|
||||||
|
@ -51,25 +51,13 @@
|
||||||
let modal
|
let modal
|
||||||
|
|
||||||
$: text = value?.label ?? "Choose an option"
|
$: text = value?.label ?? "Choose an option"
|
||||||
$: tables = $tablesStore.list
|
$: tables = sortAndFormat.tables($tablesStore.list, $datasources.list)
|
||||||
.map(table => format.table(table, $datasources.list))
|
|
||||||
.sort((a, b) => {
|
|
||||||
// sort tables alphabetically, grouped by datasource
|
|
||||||
const dsA = a.datasourceName ?? ""
|
|
||||||
const dsB = b.datasourceName ?? ""
|
|
||||||
|
|
||||||
const dsComparison = dsA.localeCompare(dsB)
|
|
||||||
if (dsComparison !== 0) {
|
|
||||||
return dsComparison
|
|
||||||
}
|
|
||||||
return a.label.localeCompare(b.label)
|
|
||||||
})
|
|
||||||
$: viewsV1 = $viewsStore.list.map(view => ({
|
$: viewsV1 = $viewsStore.list.map(view => ({
|
||||||
...view,
|
...view,
|
||||||
label: view.name,
|
label: view.name,
|
||||||
type: "view",
|
type: "view",
|
||||||
}))
|
}))
|
||||||
$: viewsV2 = $viewsV2Store.list.map(format.viewV2)
|
$: viewsV2 = sortAndFormat.viewsV2($viewsV2Store.list, $datasources.list)
|
||||||
$: views = [...(viewsV1 || []), ...(viewsV2 || [])]
|
$: views = [...(viewsV1 || []), ...(viewsV2 || [])]
|
||||||
$: queries = $queriesStore.list
|
$: queries = $queriesStore.list
|
||||||
.filter(q => showAllQueries || q.queryVerb === "read" || q.readable)
|
.filter(q => showAllQueries || q.queryVerb === "read" || q.readable)
|
||||||
|
|
|
@ -1,22 +1,32 @@
|
||||||
<script>
|
<script>
|
||||||
import { Select } from "@budibase/bbui"
|
import { Popover, Select } from "@budibase/bbui"
|
||||||
import { createEventDispatcher, onMount } from "svelte"
|
import { createEventDispatcher, onMount } from "svelte"
|
||||||
import { tables as tablesStore, viewsV2 } from "@/stores/builder"
|
import {
|
||||||
import { tableSelect as format } from "@/helpers/data/format"
|
tables as tableStore,
|
||||||
|
datasources as datasourceStore,
|
||||||
|
viewsV2 as viewsV2Store,
|
||||||
|
} from "@/stores/builder"
|
||||||
|
import DataSourceCategory from "./DataSourceSelect/DataSourceCategory.svelte"
|
||||||
|
import { sortAndFormat } from "@/helpers/data/format"
|
||||||
|
|
||||||
export let value
|
export let value
|
||||||
|
|
||||||
|
let anchorRight, dropdownRight
|
||||||
|
|
||||||
const dispatch = createEventDispatcher()
|
const dispatch = createEventDispatcher()
|
||||||
|
|
||||||
$: tables = $tablesStore.list.map(format.table)
|
$: tables = sortAndFormat.tables($tableStore.list, $datasourceStore.list)
|
||||||
$: views = $viewsV2.list.map(format.viewV2)
|
$: views = sortAndFormat.viewsV2($viewsV2Store.list, $datasourceStore.list)
|
||||||
$: options = [...(tables || []), ...(views || [])]
|
$: options = [...(tables || []), ...(views || [])]
|
||||||
|
|
||||||
|
$: text = value?.label ?? "Choose an option"
|
||||||
|
|
||||||
const onChange = e => {
|
const onChange = e => {
|
||||||
dispatch(
|
dispatch(
|
||||||
"change",
|
"change",
|
||||||
options.find(x => x.resourceId === e.detail)
|
options.find(x => x.resourceId === e.resourceId)
|
||||||
)
|
)
|
||||||
|
dropdownRight.hide()
|
||||||
}
|
}
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
|
@ -29,10 +39,47 @@
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Select
|
<div class="container" bind:this={anchorRight}>
|
||||||
on:change={onChange}
|
<Select
|
||||||
value={value?.resourceId}
|
readonly
|
||||||
{options}
|
value={text}
|
||||||
getOptionValue={x => x.resourceId}
|
options={[text]}
|
||||||
getOptionLabel={x => x.label}
|
on:click={dropdownRight.show}
|
||||||
/>
|
/>
|
||||||
|
</div>
|
||||||
|
<Popover bind:this={dropdownRight} anchor={anchorRight}>
|
||||||
|
<div class="dropdown">
|
||||||
|
<DataSourceCategory
|
||||||
|
heading="Tables"
|
||||||
|
dataSet={tables}
|
||||||
|
{value}
|
||||||
|
onSelect={onChange}
|
||||||
|
/>
|
||||||
|
{#if views?.length}
|
||||||
|
<DataSourceCategory
|
||||||
|
dividerState={true}
|
||||||
|
heading="Views"
|
||||||
|
dataSet={views}
|
||||||
|
{value}
|
||||||
|
onSelect={onChange}
|
||||||
|
/>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
</Popover>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: flex-start;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.container :global(:first-child) {
|
||||||
|
flex: 1 1 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown {
|
||||||
|
padding: var(--spacing-m) 0;
|
||||||
|
z-index: 99999999;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
|
@ -9,11 +9,18 @@ export const datasourceSelect = {
|
||||||
datasourceName: datasource?.name,
|
datasourceName: datasource?.name,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
viewV2: view => ({
|
viewV2: (view, datasources) => {
|
||||||
...view,
|
const datasource = datasources
|
||||||
label: view.name,
|
.filter(f => f.entities)
|
||||||
type: "viewV2",
|
.flatMap(d => d.entities)
|
||||||
}),
|
.find(ds => ds._id === view.tableId)
|
||||||
|
return {
|
||||||
|
...view,
|
||||||
|
label: view.name,
|
||||||
|
type: "viewV2",
|
||||||
|
datasourceName: datasource?.name,
|
||||||
|
}
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
export const tableSelect = {
|
export const tableSelect = {
|
||||||
|
@ -31,3 +38,36 @@ export const tableSelect = {
|
||||||
resourceId: view.id,
|
resourceId: view.id,
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const sortAndFormat = {
|
||||||
|
tables: (tables, datasources) => {
|
||||||
|
return tables
|
||||||
|
.map(table => {
|
||||||
|
const formatted = datasourceSelect.table(table, datasources)
|
||||||
|
return {
|
||||||
|
...formatted,
|
||||||
|
resourceId: table._id,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.sort((a, b) => {
|
||||||
|
// sort tables alphabetically, grouped by datasource
|
||||||
|
const dsA = a.datasourceName ?? ""
|
||||||
|
const dsB = b.datasourceName ?? ""
|
||||||
|
|
||||||
|
const dsComparison = dsA.localeCompare(dsB)
|
||||||
|
if (dsComparison !== 0) {
|
||||||
|
return dsComparison
|
||||||
|
}
|
||||||
|
return a.label.localeCompare(b.label)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
viewsV2: (views, datasources) => {
|
||||||
|
return views.map(view => {
|
||||||
|
const formatted = datasourceSelect.viewV2(view, datasources)
|
||||||
|
return {
|
||||||
|
...formatted,
|
||||||
|
resourceId: view.id,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue