mirror of https://github.com/Budibase/budibase.git
nocodelowcodelow-codedockerdocker-composeinternal-projectinternal-toolinternal-toolslow-code-developmentlow-code-development-platformopensourceselfhostedweb-devweb-developmentweb-development-toolswebdevwebdevelopmentworkflow-automationautomationdeveloper-tools
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
3.0 KiB
88 lines
3.0 KiB
<script>
|
|
import Dropdown from "components/common/Dropdown.svelte"
|
|
import Textbox from "components/common/Textbox.svelte"
|
|
import Button from "components/common/Button.svelte"
|
|
import ButtonGroup from "components/common/ButtonGroup.svelte"
|
|
import NumberBox from "components/common/NumberBox.svelte"
|
|
import ValuesList from "components/common/ValuesList.svelte"
|
|
import ErrorsBox from "components/common/ErrorsBox.svelte"
|
|
import Checkbox from "components/common/Checkbox.svelte"
|
|
import ActionButton from "components/common/ActionButton.svelte"
|
|
import DatePicker from "components/common/DatePicker.svelte"
|
|
import { keys, cloneDeep } from "lodash/fp"
|
|
|
|
const FIELD_TYPES = ["string", "number", "boolean"]
|
|
|
|
export let field = { type: "string", constraints: { type: "string", presence: false } }
|
|
export let schema
|
|
export let goBack
|
|
|
|
let errors = []
|
|
let draftField = cloneDeep(field)
|
|
|
|
let type = field.type
|
|
let constraints = field.constraints
|
|
let required = field.constraints.presence && !field.constraints.presence.allowEmpty
|
|
|
|
const save = () => {
|
|
constraints.presence = required ? { allowEmpty: false } : false
|
|
draftField.constraints = constraints
|
|
draftField.type = type
|
|
schema[field.name] = draftField
|
|
goBack()
|
|
}
|
|
|
|
$: constraints =
|
|
type === "string" ? { type: "string", length: {}, presence: false }
|
|
: type === "number" ? { type: "number", presence: false, numericality: {} }
|
|
: type === "boolean" ? { type: "boolean", presence: false }
|
|
: type === "datetime" ? { type: "date", datetime: {}, presence: false }
|
|
: type.startsWith('array') ? { type: "array", presence: false }
|
|
: { type: "string", presence: false }
|
|
|
|
</script>
|
|
|
|
<div class="root">
|
|
|
|
<ErrorsBox {errors} />
|
|
|
|
<form on:submit|preventDefault class="uk-form-stacked">
|
|
<Textbox label="Name" bind:text={field.name} />
|
|
<Dropdown
|
|
label="Type"
|
|
bind:selected={type}
|
|
options={FIELD_TYPES} />
|
|
|
|
<Checkbox label="Required" bind:checked={required} />
|
|
|
|
|
|
{#if type === 'string'}
|
|
<NumberBox label="Max Length" bind:value={constraints.length.maximum} />
|
|
<ValuesList label="Categories" bind:values={constraints.inclusion} />
|
|
{:else if type === 'datetime'}
|
|
<!-- TODO: revisit and fix with JSON schema -->
|
|
<DatePicker label="Min Value" bind:value={constraints.datetime.earliest} />
|
|
<DatePicker label="Max Value" bind:value={constraints.datetime.latest} />
|
|
{:else if type === 'number'}
|
|
<NumberBox label="Min Value" bind:value={constraints.numericality.greaterThanOrEqualTo} />
|
|
<NumberBox label="Max Value" bind:value={constraints.numericality.lessThanOrEqualTo} />
|
|
{/if}
|
|
</form>
|
|
</div>
|
|
<footer>
|
|
<ActionButton primary on:click={save}>Save</ActionButton>
|
|
<ActionButton alert on:click={goBack}>Cancel</ActionButton>
|
|
</footer>
|
|
|
|
<style>
|
|
.root {
|
|
margin: 20px;
|
|
}
|
|
footer {
|
|
padding: 20px;
|
|
border-radius: 0 0 5px 5px;
|
|
bottom: 0;
|
|
left: 0;
|
|
background: #fafafa;
|
|
}
|
|
</style>
|
|
|