forked from tsai/budibase
3 changed files with 121 additions and 0 deletions
@ -0,0 +1,97 @@ |
|||
<script> |
|||
import Editor from "../../../integration/QueryEditor.svelte" |
|||
import { |
|||
ModalContent, |
|||
Tabs, |
|||
Tab, |
|||
Button, |
|||
Input, |
|||
Select, |
|||
} from "@budibase/bbui" |
|||
import { onMount, createEventDispatcher } from "svelte" |
|||
|
|||
export let onConfirm = undefined |
|||
export let schema = {} |
|||
|
|||
let dispatcher = createEventDispatcher() |
|||
let mode = "Key/Value" |
|||
let json |
|||
let fieldCount = 0 |
|||
let fieldKeys = {}, |
|||
fieldTypes = {} |
|||
let keyValueOptions = ["String", "Number", "Boolean", "Object", "Array"] |
|||
|
|||
$: invalid = false |
|||
|
|||
function onJsonUpdate({ detail }) { |
|||
// TODO: make request |
|||
const input = detail.value |
|||
console.log(input) |
|||
} |
|||
|
|||
function saveSchema() { |
|||
for (let i of Object.keys(fieldKeys)) { |
|||
const key = fieldKeys[i] |
|||
schema[key] = { |
|||
type: fieldTypes[i], |
|||
} |
|||
} |
|||
dispatcher("save", schema) |
|||
} |
|||
|
|||
onMount(() => { |
|||
if (!schema) { |
|||
schema = {} |
|||
} |
|||
let i = 0 |
|||
for (let [key, value] of Object.entries(schema)) { |
|||
fieldKeys[i] = key |
|||
fieldTypes[i] = value.type |
|||
i++ |
|||
} |
|||
fieldCount = i |
|||
}) |
|||
</script> |
|||
|
|||
<ModalContent |
|||
title={"Key/Value Schema Editor"} |
|||
confirmText="Save Column" |
|||
onConfirm={saveSchema} |
|||
disabled={invalid} |
|||
size="L" |
|||
> |
|||
<Tabs selected={mode} noPadding> |
|||
<Tab title="Key/Value"> |
|||
{#each Array(fieldCount) as _, i} |
|||
<div class="horizontal"> |
|||
<Input outline label="Key" bind:value={fieldKeys[i]} /> |
|||
<Select |
|||
label="Type" |
|||
options={keyValueOptions} |
|||
bind:value={fieldTypes[i]} |
|||
getOptionValue={field => field.toLowerCase()} |
|||
/> |
|||
</div> |
|||
{/each} |
|||
<div class:add-field-btn={fieldCount !== 0}> |
|||
<Button primary text on:click={() => fieldCount++}>Add Field</Button> |
|||
</div> |
|||
</Tab> |
|||
<Tab title="JSON"> |
|||
<Editor mode="json" on:change={onJsonUpdate} value={json} /> |
|||
</Tab> |
|||
</Tabs> |
|||
</ModalContent> |
|||
|
|||
<style> |
|||
.horizontal { |
|||
display: grid; |
|||
grid-template-columns: 30% 1fr; |
|||
grid-gap: var(--spacing-s); |
|||
align-items: center; |
|||
} |
|||
|
|||
.add-field-btn { |
|||
margin-top: var(--spacing-xl); |
|||
} |
|||
</style> |
|||
Loading…
Reference in new issue