forked from tsai/budibase
7 changed files with 125 additions and 91 deletions
@ -0,0 +1,14 @@ |
|||||
|
<script> |
||||
|
import { getContext, setContext } from "svelte" |
||||
|
|
||||
|
const component = getContext("component") |
||||
|
const { styleable } = getContext("sdk") |
||||
|
|
||||
|
setContext("block", { |
||||
|
id: $component.id, |
||||
|
}) |
||||
|
</script> |
||||
|
|
||||
|
<div use:styleable={$component.styles}> |
||||
|
<slot /> |
||||
|
</div> |
||||
@ -0,0 +1,33 @@ |
|||||
|
<script> |
||||
|
import { getContext } from "svelte" |
||||
|
import { generate } from "shortid" |
||||
|
import Component from "components/Component.svelte" |
||||
|
|
||||
|
export let type |
||||
|
export let props |
||||
|
export let styles |
||||
|
export let id |
||||
|
|
||||
|
const block = getContext("block") |
||||
|
const rand = generate() |
||||
|
|
||||
|
$: id = block.id + rand |
||||
|
$: instance = createInstance(type, props, id) |
||||
|
|
||||
|
const createInstance = (type, props, id) => { |
||||
|
return { |
||||
|
_component: `@budibase/standard-components/${type}`, |
||||
|
_id: id, |
||||
|
_styles: { |
||||
|
normal: { |
||||
|
...styles, |
||||
|
}, |
||||
|
}, |
||||
|
...props, |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<Component {instance}> |
||||
|
<slot /> |
||||
|
</Component> |
||||
@ -1,99 +1,89 @@ |
|||||
<script> |
<script> |
||||
import { getContext } from "svelte" |
import Block from "./Block.svelte" |
||||
import { BlockBuilder } from "./block-builder" |
import BlockComponent from "./BlockComponent.svelte" |
||||
import Component from "components/Component.svelte" |
|
||||
|
|
||||
// Common props |
|
||||
export let searchColumns |
|
||||
export let dataSource |
export let dataSource |
||||
|
export let searchColumns |
||||
// Data provider props |
|
||||
export let filter |
export let filter |
||||
export let sortColumn |
export let sortColumn |
||||
export let sortOrder |
export let sortOrder |
||||
export let paginate |
export let paginate |
||||
|
|
||||
// Table props |
|
||||
export let tableColumns |
export let tableColumns |
||||
export let showAutoColumns |
export let showAutoColumns |
||||
export let rowCount |
export let rowCount |
||||
export let quiet |
export let quiet |
||||
export let size |
export let size |
||||
|
|
||||
const { styleable } = getContext("sdk") |
let formId |
||||
const component = getContext("component") |
let dataProviderId |
||||
|
|
||||
let instance |
|
||||
$: { |
|
||||
const builder = new BlockBuilder($component) |
|
||||
|
|
||||
const form = builder.createComponent("form", { |
|
||||
dataSource, |
|
||||
}) |
|
||||
|
|
||||
let newFilter = [...(filter || [])] |
|
||||
|
|
||||
// Add search bar if required |
|
||||
if (searchColumns?.length) { |
|
||||
const searchContainer = builder |
|
||||
.createComponent("container", { |
|
||||
direction: "row", |
|
||||
hAlign: "right", |
|
||||
vAlign: "middle", |
|
||||
gap: "M", |
|
||||
wrap: true, |
|
||||
}) |
|
||||
.setStyles({ |
|
||||
"margin-bottom": "20px", |
|
||||
}) |
|
||||
|
|
||||
searchColumns?.forEach(column => { |
$: enrichedFilter = enrichFilter(filter, searchColumns, formId) |
||||
const field = builder.createComponent("stringfield", { |
|
||||
field: column, |
|
||||
placeholder: column, |
|
||||
label: column, |
|
||||
}) |
|
||||
|
|
||||
searchContainer.addChild(field) |
const enrichFilter = (filter, searchColumns, formId) => { |
||||
|
let enrichedFilter = [...(filter || [])] |
||||
newFilter.push({ |
searchColumns?.forEach(column => { |
||||
field: column, |
enrichedFilter.push({ |
||||
operator: "equal", |
field: column, |
||||
type: "string", |
operator: "equal", |
||||
valueType: "Binding", |
type: "string", |
||||
value: `{{ [${form.id}].[${column}] }}`, |
valueType: "Binding", |
||||
}) |
value: `{{ [${formId}].[${column}] }}`, |
||||
}) |
}) |
||||
|
|
||||
form.addChild(searchContainer) |
|
||||
} |
|
||||
|
|
||||
const dataProvider = builder.createComponent("dataprovider", { |
|
||||
dataSource, |
|
||||
filter: newFilter, |
|
||||
sortColumn, |
|
||||
sortOrder, |
|
||||
paginate, |
|
||||
limit: rowCount, |
|
||||
}) |
|
||||
|
|
||||
const table = builder.createComponent("table", { |
|
||||
dataProvider: `{{ literal [${dataProvider.id}] }}`, |
|
||||
columns: tableColumns, |
|
||||
showAutoColumns, |
|
||||
rowCount, |
|
||||
quiet, |
|
||||
size, |
|
||||
}) |
}) |
||||
|
return enrichedFilter |
||||
dataProvider.addChild(table) |
|
||||
|
|
||||
form.addChild(dataProvider) |
|
||||
instance = form.build() |
|
||||
console.log("new instance") |
|
||||
} |
} |
||||
</script> |
</script> |
||||
|
|
||||
<div use:styleable={$component.styles}> |
<Block> |
||||
<Component {instance} /> |
<BlockComponent type="form" bind:id={formId} props={{ dataSource }}> |
||||
</div> |
{#if searchColumns?.length} |
||||
|
<div class="search"> |
||||
|
{#each searchColumns as column} |
||||
|
<BlockComponent |
||||
|
type="stringfield" |
||||
|
props={{ |
||||
|
field: column, |
||||
|
placeholder: column, |
||||
|
label: column, |
||||
|
}} |
||||
|
/> |
||||
|
{/each} |
||||
|
</div> |
||||
|
{/if} |
||||
|
<BlockComponent |
||||
|
type="dataprovider" |
||||
|
bind:id={dataProviderId} |
||||
|
props={{ |
||||
|
dataSource, |
||||
|
filter: enrichedFilter, |
||||
|
sortColumn, |
||||
|
sortOrder, |
||||
|
paginate, |
||||
|
limit: rowCount, |
||||
|
}} |
||||
|
> |
||||
|
<BlockComponent |
||||
|
type="table" |
||||
|
props={{ |
||||
|
dataProvider: `{{ literal [${dataProviderId}] }}`, |
||||
|
columns: tableColumns, |
||||
|
showAutoColumns, |
||||
|
rowCount, |
||||
|
quiet, |
||||
|
size, |
||||
|
}} |
||||
|
/> |
||||
|
</BlockComponent> |
||||
|
</BlockComponent> |
||||
|
</Block> |
||||
|
|
||||
|
<style> |
||||
|
.search { |
||||
|
display: flex; |
||||
|
flex-direction: row; |
||||
|
justify-content: flex-end; |
||||
|
align-items: center; |
||||
|
margin-bottom: 20px; |
||||
|
gap: 10px; |
||||
|
} |
||||
|
</style> |
||||
|
|||||
Loading…
Reference in new issue